【问题标题】:How can I have CMAKE_BUILD_TYPE being propagated to sublibraries included via add_subdirectory?如何将 CMAKE_BUILD_TYPE 传播到通过 add_subdirectory 包含的子库?
【发布时间】:2021-05-18 07:23:09
【问题描述】:

我的构建由几个子库组成,这些子库先构建然后链接在一起。

在主 cmakelists.txt 中添加了

add_subdirectory (src/submodules/CanTp/CanTp CanTp)

并添加了链接器依赖项

target_link_libraries(my_app_name PRIVATE CanTp/${CMAKE_BUILD_TYPE}/CanTp

CanTp 的 cmakelists.txt 是

add_library (CanTp CanTp.cpp)

target_include_directories (CanTp PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})

问题在于 CanTp 始终使用构建类型 Debug 构建,而与 CMAKE_BUILD_TYPE 无关。 CMAKE_BUILD_TYPE 确实对顶部 cmakelists.txt 中源文件的构建类型有影响,所以我知道它设置正确。

如何将 CMAKE_BUILD_TYPE 传播到通过 add_subdirectory 包含的子库?

【问题讨论】:

  • “问题是 CanTp 始终使用构建类型 Debug 构建” - 你如何确定?您是否检查过它的编译标志,发现它们对应于CMAKE_CXX_FLAGS_DEBUG 而不是CMAKE_CXX_FLAGS_RELEASE?变量CMAKE_BUILD_TYPE 像许多其他 CMake 变量一样被传播到子目录。另外,为什么要链接CanTp/${CMAKE_BUILD_TYPE}/CanTp?如果您想与 target CanTp 对应的库进行链接,则使用给定的目标进行链接:target_link_libraries(my_app_name PRIVATE CanTp)
  • @Tsyvarev 我确定 CanTp 始终以调试方式构建,因为在这种情况下,Visual Studio(在这种情况下使用的编译器)将输出放在以构建类型(“调试”)命名的文件夹中。这也是我链接 CanTp/${CMAKE_BUILD_TYPE}/CanTp 的原因。当我按照您的建议尝试链接给定目标时,链接器找不到库文件,因为 Visual Studio 已将其放置在“CanTp\Debug”文件夹中
  • 哦,原来是 Visual Studio... 这个生成器是multiconfiguration:项目被配置为一次的多个配置。变量 CMAKE_BUILD_TYPE 对 Visual Studio 没有任何意义。 “当我尝试链接给定的目标时,正如你所建议的那样,链接器找不到库文件,因为 Visual Studio 已将它放在文件夹“CanTp\Debug”中” - CMake 应该正确地将目标转换为库路径.可能是您的代码有问题。请将您的代码添加到问题帖子中(以minimal reproducible example 的形式)。

标签: c++ visual-studio cmake


【解决方案1】:

正如@Tsyvarev 所述,Visual Studio CMake 生成器是一个多配置生成器,这意味着它可以一次提供所有配置。 CMAKE_BUILD_TYPE 仅对像 Unix Makefiles 这样的单个配置生成器有效。

要支持这两种类型的生成器,您不应该阅读CMAKE_BUILD_TYPE,除非您有充分的理由这样做并检查了当前配置是否使用单个配置生成器。

指定配置相关属性的首选方法是使用generator expressions。它们不能在任何地方使用,有时属性只允许生成器表达式,因为特定的 CMake 版本。

target_link_libraries 允许使用自版本 3.0 以来的生成器表达式,因此在这种情况下使用它们应该没有问题。

target_link_libraries(my_app_name PRIVATE CanTp/$<CONFIG>/CanTp)

这适用于单配置生成器和多配置生成器。您应该通过命令行参数指定配置。

Windows/Visual Studio

mkdir build
cmake -G "Visual Studio 16 2019" -A x64 -S src -B build
cmake --build build --config Debug

Unix/Make

mkdir build
cmake -G "Unix Makefiles" -D CMAKE_BUILD_TYPE=Debug -S src -B build
cmake --build build

【讨论】:

    猜你喜欢
    • 2022-10-24
    • 2011-12-11
    • 1970-01-01
    • 2021-04-01
    • 1970-01-01
    • 2021-08-21
    • 2012-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多