我有一个我想在Visual Studio 2017中构建的程序,我也希望CMake生成我的proj / sln文件,因此我在Windows10上使用CMake 3.8.2和visual studio generator 2017 amd64。
事实上,我的程序在Debug或Release中构建时需要链接不同的库,我希望生成的VS proj在Visual Studio中切换配置时正确选择要链接的正确库。这可以通过手动编辑proj文件轻松实现,但我希望CMake为我做这件事。
在CMakeLists.txt中,我收集了两个列表LIBS_DEBUG
和LIBS_RELEASE
中的相关库,到目前为止,我尝试了以下内容:
target_link_libraries(MyProgram debug ${LIBS_DEBUG} optimized ${LIBS_RELEASE})
这不起作用,因为它生成两个选项以在VS.
内的两个配置中出现 target_link_libraries(MyProgram $<$<CONFIG:Debug>:${LIBS_DEBUG}>
$<$<CONFIG:Release>:${LIBS_RELEASE}>)
我从未使用过生成器表达式,因此我不确定上述内容是否正确,但我“复制”了它from the docs。无论如何它不起作用,因为它使两个配置中都显示了两个库。
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配置生成“可编程”链接的正确/最佳方法是什么?
答案 0 :(得分:1)
经过多次挖掘,我可以自己回答,我会为其他可能会遇到这个问题的人发布答案。
方法2是正确的答案,但由于列表变量LIBS_RELEASE
和foreach(DL ${LIBS_DEBUG})
target_link_libraries(MyProgram
$<$<CONFIG:Debug>:${DL}>)
endforeach()
foreach(RL ${LIBS_RELEASE})
target_link_libraries(MyProgram
$<$<CONFIG:Release>:${RL}>)
endforeach()
,它无效。
看来列表扩展在generator-expression中没有完全正常工作,我找到了可能相关的old bug。
解决方案是自己扩展列表,然后在列表的每个元素上调用generator-expression。这个解决方案对我有用:
{{1}}
它可能不那么优雅,但效果很好。