【问题标题】:CMake doesn't add optimised and debug libraries correctly to VS projectCMake 未将优化和调试库正确添加到 VS 项目
【发布时间】:2020-04-16 09:48:55
【问题描述】:

我在 CMake 中有这段代码,用于为我拥有的项目查找调试和发布库:

FIND_LIBRARY(MP4V2_LIBRARY_RELEASE libmp4v2 HINTS "${MP4V2_DIR}/bin/Windows-x64/Release Static (MT)")
FIND_LIBRARY(MP4V2_LIBRARY_BEDUG libmp4v2 HINTS "${MP4V2_DIR}/bin/Windows-x64/Debug Static (MTd)")
set(MP4V2_LIBRARIES "optimized ${MP4V2_LIBRARY_RELEASE} debug  ${MP4V2_LIBRARY_BEDUG}") 
message(STATUS ${MP4V2_LIBRARIES})

当我运行 CMake 时它会正确展开:

optimized D:/MyData/SourceCode/camm_mp4v2/bin/Windows-x64/Release Static (MT)/libmp4v2.lib debug  D:/MyData/SourceCode/camm_mp4v2/bin/Windows-x64/Debug Static (MTd)/libmp4v2.lib

然后我像这样将它添加到我的应用程序中:

target_link_libraries(MyApp ${MP4V2_LIBRARIES})

当我为 VS 创建项目并尝试编译它时,我收到此错误:

cannot open file 'optimized D:\MyData\SourceCode\camm_mp4v2\bin\Windows-x64\Release Static (MT)\libmp4v2.lib debug  D:\MyData\SourceCode\camm_mp4v2\bin\Windows-x64\Debug Static (MTd)\libmp4v2.lib.lib'

显然,CMake 没有检测到优化和调试库。

这段代码有什么问题,我该如何解决?

【问题讨论】:

  • 您想将optimized${MP4V2_LIBRARY_RELEASE}debugdebug列表 分配给变量MP4V2_LIBRARIES,但将此列表包含在 中双引号...因此,变量的值不是列表,而是由4个空格分隔的单词组成的字符串。您在message() 输出中观察到的正是这一点。删除双引号或用分号分隔单词;
  • @Tsyvarev 这解决了我的问题。请提出作为答案,我会接受。

标签: c++ visual-studio cmake


【解决方案1】:

改为创建IMPORTED 目标:

add_library(mp4v2 STATIC IMPORTED)
set_target_properties(mp4v2 PROPERTIES
    IMPORTED_LOCATION_DEBUG ${MP4V2_LIBRARY_DEBUG}
    IMPORTED_LOCATION_RELEASE ${MP4V2_LIBRARY_RELEASE})
target_link_libraries(MyApp mp4v2)

如果有任何标题,您也可以设置INTERFACE_INCLUDE_DIRECTORIES 属性。

【讨论】:

  • 谢谢,能详细点吗?为什么我的代码不起作用?我无法更改“Target_Link_Libraries”行,因为他们准备了 ${MP4V2_LIBRARIES} 的其他几个目标(Linux 等),我无法更改它们。
  • “优化”和“调试”关键字对 CMake 来说毫无意义。
  • 我从这个答案中了解到:stackoverflow.com/questions/2209929/…
  • 啊,我的立场是正确的。 @Tsyvarev 的回答是正确的。
猜你喜欢
  • 1970-01-01
  • 2017-02-16
  • 2018-03-30
  • 1970-01-01
  • 1970-01-01
  • 2020-11-15
  • 1970-01-01
  • 2019-07-02
  • 1970-01-01
相关资源
最近更新 更多