CMake Visual Studio proj Generator和每个CONFIG链接

时间:2017-07-13 08:48:48

标签: cmake linker config visual-studio-2017 cmake-gui

我有一个我想在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_DEBUGLIBS_RELEASE中的相关库,到目前为止,我尝试了以下内容:

  1. 优化/调试关键字
  2. target_link_libraries(MyProgram debug ${LIBS_DEBUG} optimized ${LIBS_RELEASE})

    这不起作用,因为它生成两个选项以在VS.

    内的两个配置中出现
    1. 发生器表达式
    2. target_link_libraries(MyProgram $<$<CONFIG:Debug>:${LIBS_DEBUG}> $<$<CONFIG:Release>:${LIBS_RELEASE}>)

      我从未使用过生成器表达式,因此我不确定上述内容是否正确,但我“复制”了它from the docs。无论如何它不起作用,因为它使两个配置中都显示了两个库。

      1. 检查CMake构建类型
      2. 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配置生成“可编程”链接的正确/最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

经过多次挖掘,我可以自己回答,我会为其他可能会遇到这个问题的人发布答案。

方法2是正确的答案,但由于列表变量LIBS_RELEASEforeach(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}}

它可能不那么优雅,但效果很好。