如何使用 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 链接库?的主要内容,如果未能解决你的问题,请参考以下文章