C++ 如何使用CMake链接库?
我正在尝试向使用CMake构建的项目添加一个新库,但遇到了问题。我试着跟着。我做了一个如下的测试项目:C++ 如何使用CMake链接库?,c++,makefile,cmake,C++,Makefile,Cmake,我正在尝试向使用CMake构建的项目添加一个新库,但遇到了问题。我试着跟着。我做了一个如下的测试项目: cmake_test/ test.cpp CMakeLists.txt liblsl/ include/ lsl_cpp.h CMakeLists.txt liblsl64.dll liblsl64.so build/ find_path(LSL_INCLUDE_DIR l
cmake_test/
test.cpp
CMakeLists.txt
liblsl/
include/
lsl_cpp.h
CMakeLists.txt
liblsl64.dll
liblsl64.so
build/
find_path(LSL_INCLUDE_DIR lsl_cpp.h)
find_library(LSL_LIBRARY liblsl64)
include_directories(${LSL_INCLUDE_DIR})
cmake_测试中的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如下所示:
cmake_test/
test.cpp
CMakeLists.txt
liblsl/
include/
lsl_cpp.h
CMakeLists.txt
liblsl64.dll
liblsl64.so
build/
find_path(LSL_INCLUDE_DIR lsl_cpp.h)
find_library(LSL_LIBRARY liblsl64)
include_directories(${LSL_INCLUDE_DIR})
但是我不断得到错误没有规则使“Tutorial.exe”需要目标“…/liblsl64.lib”。停止。
知道我做错了什么吗?
我在Windows 10上使用的是mingw-w64 v5.4.0,如果这有什么区别的话。
CMakeLists.txt
在cmake\u测试中:
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)
liblsl
中的CMakeLists.txt
:
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")
在中,您说SHARED
,因为您的库是共享库(so
/dll
),您说IMPORTED
,因为您不想构建库,您之所以说GLOBAL
,是因为您希望它在liblsl
外部可见,在您使用它进行链接时,LSL\u库
变量的内容是什么?如果它指向.dll
,则需要相应的.lib
(不是静态库,而是“导出”文件)才能执行链接。这就是错误消息所说的。我用指向.lib文件的LSL_库设置了它