首页 > 解决方案 > 使用 CMake 和 Visual Studio 将文件包含在外部目标中

问题描述

我正在从事使用 CMake 的中型项目。最近,在为 Visual Studio 2019 生成项目文件时,我发现了奇怪的行为。问题:

让我们A成为B目标。A是一个可执行文件,它依赖于B一个静态库。使用 建立关系target_link_libraries

如果我将此项目加载到 Visual Studio 中,则会看到以下目录结构:

Solution/
- Project A/
  - src/
    - sources_of_a.cpp
    - ...
  - B/ # <- WHY?
    - all_sources_of_b.cpp
      ...
- Project B/
  - src/
    - sources_of_b.cpp
      ...

老实说,我什至不知道如何更好地描述这个问题,更不用说可能导致它的原因了。我所知道的是 B 的来源不应该是 A 的来源集的一部分。

有谁知道发生了什么?

值得注意的旁注:

标签: cmakevisual-studio-2019

解决方案


问题是对 的调用target_source,其中标头被指定为公共来源。即像这样:

target_sources(
    B
    PRIVATE
        ${CMAKE_CURRENT_SOURCE_DIR}/src/source_of_b_.cpp
    PUBLIC
        ${CMAKE_CURRENT_SOURCE_DIR}/include/B/header_of_b.hpp
)

删除PUBLIC标记可以解决问题。将其更改为:

target_sources(
    B
    PRIVATE
        ${CMAKE_CURRENT_SOURCE_DIR}/src/source_of_b_.cpp
        ${CMAKE_CURRENT_SOURCE_DIR}/include/B/header_of_b.hpp
)

显然我完全误解了语义,尽管 CMake 文档是同类中最好的


推荐阅读