C++ 如何使用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构建的项目添加一个新库,但遇到了问题。我试着跟着。我做了一个如下的测试项目:

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_库设置了它