如何使用 CMake 链接库?

Posted

技术标签:

【中文标题】如何使用 CMake 链接库?【英文标题】:How do I link a library using CMake? 【发布时间】:2019-11-15 05:40:10 【问题描述】:

我正在尝试将新库添加到使用 CMake 构建的项目中,但遇到了问题。我正在尝试关注this。我做了一个如下所示的测试项目:

cmake_test/
    test.cpp
    CMakeLists.txt
    liblsl/
        include/
            lsl_cpp.h
        CMakeLists.txt
        liblsl64.dll
        liblsl64.so
    build/

cmake_test 中的 CMakeLists.txt 如下所示:

cmake_minimum_required(VERSION 3.10)

# set the project name and version
project(Tutorial VERSION 1.0)

# specify the C++ standard
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)

add_executable(Tutorial test.cpp)
add_subdirectory(liblsl)
target_link_libraries(Tutorial PUBLIC $LSL_LIBRARY)

liblsl 中的 CMakeLists.txt 如下所示:

find_path(LSL_INCLUDE_DIR lsl_cpp.h)
find_library(LSL_LIBRARY liblsl64)
include_directories($LSL_INCLUDE_DIR)

但我不断收到错误No rule to make target '.../liblsl64.lib', needed by 'Tutorial.exe'. Stop. 知道我做错了什么吗? 如果这有什么不同的话,我正在使用 mingw-w64 v5.4.0 在 Windows 10 上。

【问题讨论】:

LSL_LIBRARY 变量在您用于链接时的内容是什么?如果它指向.dll,那么您需要对应的.lib(不是静态库而是“导出”文件)才能执行链接。这就是错误消息所说的内容。 我设置了 LSL_LIBRARY 指向 .lib 文件 【参考方案1】:

CMakeLists.txt in cmake_test:

cmake_minimum_required(VERSION 3.10)
project(Tutorial VERSION 1.0)

add_subdirectory(liblsl)

add_executable(Tutorial test.cpp)
target_compile_features(Tutorial PUBLIC cxx_std_11)
target_link_libraries(Tutorial PUBLIC liblsl)

CMakeLists.txt in liblsl:

add_library(liblsl SHARED IMPORTED GLOBAL)
set_target_properties(liblsl PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "$CMAKE_CURRENT_SOURCE_DIR/include")
set_target_properties(liblsl PROPERTIES IMPORTED_LOCATION "$CMAKE_CURRENT_SOURCE_DIR/liblsl64.so")

Windows 使用:

set_target_properties(liblsl PROPERTIES IMPORTED_LOCATION "$CMAKE_CURRENT_SOURCE_DIR/liblsl64.dll")
set_target_properties(liblsl PROPERTIES IMPORTED_IMPLIB "$CMAKE_CURRENT_SOURCE_DIR/liblsl64.lib")

add_library 中,你说SHARED 因为你的库是共享库(so/dll),你说IMPORTED 因为你不想构建库,你说@ 987654334@,因为您希望它在 liblsl 之外可见。

【讨论】:

以上是关于如何使用 CMake 链接库?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用cmake生成基于静态库的动态链接库

如何使用 CMake 自动链接 boost 库

[cmake]如何使用 cmake 在 windows 上包含和链接系统库

如何使用 cmake 正确链接库?

如何使用 cmake 链接 Python3 库?

如何让 CMake 在任何地方自动添加 MagickWand 库链接