CMake Visual Studio proj 生成器和每个 CONFIG 链接
CMake Visual Studio proj Generator and per CONFIG linking
我有一个程序想在 Visual Studio 2017 年构建,我还希望 CMake 生成我的 proj/sln 文件,因此我在 Windows10 上使用 CMake 3.8.2使用 visual studio 生成器 2017 amd64。
事情是,我的程序需要不同的库来 link 在 Debug 或 Release 中构建时,我希望生成的 VS proj 在切换配置时正确 select 正确的库到 link Visual Studio 里面。这可以通过手动编辑 proj 文件轻松实现,但我希望 CMake 为我完成。
在 CMakeLists.txt 中,我将相关库收集在两个列表 LIBS_DEBUG
和 LIBS_RELEASE
中,到目前为止,我尝试了以下操作:
- optimized/debug 关键字
target_link_libraries(MyProgram debug ${LIBS_DEBUG} optimized ${LIBS_RELEASE})
这不起作用,因为它会生成两个选项以显示在 VS 中的两个配置中。
- 生成器表达式
target_link_libraries(MyProgram $<$<CONFIG:Debug>:${LIBS_DEBUG}>
$<$<CONFIG:Release>:${LIBS_RELEASE}>)
我从未使用过生成器表达式,所以我不确定上面的内容是否正确,但我 "copied" 它 from the docs。无论如何,它不起作用,因为它使两种配置中的两个库都出现。
- 检查 CMake 构建类型
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
target_link_libraries(MyProgram ${LIBS_DEBUG})
endif()
if(CMAKE_BUILD_TYPE STREQUAL "Release")
target_link_libraries(MyProgram ${LIBS_RELEASE})
endif()
这也不起作用,因为它会生成空配置集。
最后是问题:
根据 Visual Studio 配置生成 "programmable" linking 的 correct/optimal 方法是什么?
经过更多的挖掘,我可以自己回答,我会 post 为可能遇到这个问题的其他人提供答案。
方法 2 是正确的答案,但是,由于列表变量 LIBS_DEBUG
和 LIBS_RELEASE
,它不起作用。
似乎列表扩展在生成器表达式中没有完全发挥作用,我发现了一个可能相关的 old bug。
解决办法是自己扩展列表,然后在列表的每个元素上调用生成器表达式。这个解决方案对我有用:
foreach(DL ${LIBS_DEBUG})
target_link_libraries(MyProgram
$<$<CONFIG:Debug>:${DL}>)
endforeach()
foreach(RL ${LIBS_RELEASE})
target_link_libraries(MyProgram
$<$<CONFIG:Release>:${RL}>)
endforeach()
它可能不是那么优雅,但效果很好。
我有一个程序想在 Visual Studio 2017 年构建,我还希望 CMake 生成我的 proj/sln 文件,因此我在 Windows10 上使用 CMake 3.8.2使用 visual studio 生成器 2017 amd64。
事情是,我的程序需要不同的库来 link 在 Debug 或 Release 中构建时,我希望生成的 VS proj 在切换配置时正确 select 正确的库到 link Visual Studio 里面。这可以通过手动编辑 proj 文件轻松实现,但我希望 CMake 为我完成。
在 CMakeLists.txt 中,我将相关库收集在两个列表 LIBS_DEBUG
和 LIBS_RELEASE
中,到目前为止,我尝试了以下操作:
- optimized/debug 关键字
target_link_libraries(MyProgram debug ${LIBS_DEBUG} optimized ${LIBS_RELEASE})
这不起作用,因为它会生成两个选项以显示在 VS 中的两个配置中。
- 生成器表达式
target_link_libraries(MyProgram $<$<CONFIG:Debug>:${LIBS_DEBUG}>
$<$<CONFIG:Release>:${LIBS_RELEASE}>)
我从未使用过生成器表达式,所以我不确定上面的内容是否正确,但我 "copied" 它 from the docs。无论如何,它不起作用,因为它使两种配置中的两个库都出现。
- 检查 CMake 构建类型
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
target_link_libraries(MyProgram ${LIBS_DEBUG})
endif()
if(CMAKE_BUILD_TYPE STREQUAL "Release")
target_link_libraries(MyProgram ${LIBS_RELEASE})
endif()
这也不起作用,因为它会生成空配置集。
最后是问题: 根据 Visual Studio 配置生成 "programmable" linking 的 correct/optimal 方法是什么?
经过更多的挖掘,我可以自己回答,我会 post 为可能遇到这个问题的其他人提供答案。
方法 2 是正确的答案,但是,由于列表变量 LIBS_DEBUG
和 LIBS_RELEASE
,它不起作用。
似乎列表扩展在生成器表达式中没有完全发挥作用,我发现了一个可能相关的 old bug。
解决办法是自己扩展列表,然后在列表的每个元素上调用生成器表达式。这个解决方案对我有用:
foreach(DL ${LIBS_DEBUG})
target_link_libraries(MyProgram
$<$<CONFIG:Debug>:${DL}>)
endforeach()
foreach(RL ${LIBS_RELEASE})
target_link_libraries(MyProgram
$<$<CONFIG:Release>:${RL}>)
endforeach()
它可能不是那么优雅,但效果很好。