C++11 使用外部库时没有生成目标makefile的规则

C++11 使用外部库时没有生成目标makefile的规则,c++11,cmake,C++11,Cmake,我试图解决这个问题,但最终我放弃了,我无法解决它 我正在使用CLion,需要导入一个外部共享库(ts3client.so)。无论我做什么,都会以这样或那样的方式失败 目前,我有以下几点: cmake_minimum_required(VERSION 3.8) project(TSMusicBot) set(CMAKE_CXX_STANDARD 11) set(SOURCE_FILES src/main.cpp) # Teamspeak Libraries INCLUDE_DIRECTORI

我试图解决这个问题,但最终我放弃了,我无法解决它

我正在使用CLion,需要导入一个外部共享库(ts3client.so)。无论我做什么,都会以这样或那样的方式失败

目前,我有以下几点:

cmake_minimum_required(VERSION 3.8)
project(TSMusicBot)

set(CMAKE_CXX_STANDARD 11)

set(SOURCE_FILES src/main.cpp)

# Teamspeak Libraries
INCLUDE_DIRECTORIES(libs/ts3_sdk_3.0.4/include)

ADD_LIBRARY (libts3client SHARED IMPORTED GLOBAL)
SET_PROPERTY (
        TARGET libts3client PROPERTY IMPORTED_LOCATION
        libs/ts3_sdk_3.0.4/bin/linux/amd64/libts3client.so)

add_executable(TSMusicBot ${SOURCE_FILES})

target_link_libraries(TSMusicBot libts3client)
这给了我以下错误:

make[2]: *** No rule to make target 'libs/ts3_sdk_3.0.4/bin/linux/amd64/libts3client.so', needed by 'TSMusicBot'.  Stop.
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/TSMusicBot.dir/all' failed
make[1]: *** [CMakeFiles/TSMusicBot.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2
我的目录结构如下所示: src/main.cpp(代码) libs/ts3_sdk_3.0.4/include/teamspeak/(其中包含库的标题) libs/ts3_sdk_3.0.4/bin/linux/amd64/libts3client.so(这是我无法导入的库)。

问题在于:

SET_PROPERTY (
    TARGET libts3client PROPERTY IMPORTED_LOCATION
    libs/ts3_sdk_3.0.4/bin/linux/amd64/libts3client.so)
这里有一个简单的相对路径,这通常会导致CMake出现问题,因为它将在不同的目录中运行命令,而不是存在
CMakeLists.txt
的目录

正如我们在一篇评论中发现的,将
导入的位置
更改为绝对路径可以修复它。但是,正确的解决方案是使用具有已知基的相对路径:

SET_PROPERTY (
    TARGET libts3client PROPERTY IMPORTED_LOCATION
    ${CMAKE_CURRENT_SOURCE_DIR}/libs/ts3_sdk_3.0.4/bin/linux/amd64/libts3client.so)

这明确表示,
libs
目录位于该
CMakeLists.txt
文件所在的目录下。

尝试使用libts3client.so的绝对路径,看看是否有效。@JohnZwinck是的,它已使其有效。你知道为什么会这样吗?