cmake - 使用 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 的来源集的一部分。
有谁知道发生了什么?
值得注意的旁注:
- B 实际上是通过
FetchContent
&导入的目标add_subdirectory
- 我实际上是在 FetchContent 上使用 CPM;但是,我只尝试了 FetchContent,问题仍然存在
- 这不会发生在我的所有目标上
解决方案
问题是对 的调用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 文档是同类中最好的。