首页 > 解决方案 > CMake VisualStudio 找不到库

问题描述

对于为我的多媒体项目创建可执行文件的最后一步,我的 CMakeFiles.txt 中有类似的内容

add_executable(project a.cpp a.h)

if(WIN32)
    link_directories(${PROJECT_SOURCE_DIR}/lib/win)
    target_link_libraries(project opengl32 glfw3dll OpenAL32 alut ogg vorbis vorbisenc vorbisfile)
else()
    link_directories(${PROJECT_SOURCE_DIR}/lib/linux)
    target_link_libraries(project gl glfw3 openal alut vorbis ogg vorbisenc vorbisfile)
endif()

目录内/lib/win是我要链接到的所有库。

但是每次告诉 cmake 构建项目时,我都会收到错误消息:

Error   LNK1104 cannot open file 'glfw3dll.lib' C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\CMakeLists.txt    C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\LINK  1   

(是的,glfw 的 CMake 项目生成的文件名为“glfw3dll.lib”)

我可以使用以下方法对每个库进行硬链接:

target_link_libraries(project ${PROJECT_SOURCE_DIR}/lib/win/glfw3dll.lib)

对于每一个库,但我想 CMake 并不是让我写所有这些......

当然也需要将相应的库复制到最终的构建和安装目录来部署软件。我如何告诉 CMake 这样做?

标签: c++cmakelinker

解决方案


正确的方法是首先使用FindLibrary

 find_library (glfw3dll_LIBRARY NAMES glfw3dll PATHS ${PROJECT_SOURCE_DIR}/lib/win)

然后使用它:

target_link_libraries(project ${glfw3dll_LIBRARY})

这有几个优点:

  • 您知道在 CMake 运行时是否正确找到了该库,
  • 由于您有一个变量,因此当您找到所有库时,平台的所有测试都归入设置。

推荐阅读