【发布时间】: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?如果您想与 targetCanTp对应的库进行链接,则使用给定的目标进行链接: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