我试图解决这个问题,但最终我放弃了,我无法理解。
我正在使用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(这是我无法导入的库)。
答案 0 :(得分:1)
问题在于:
SET_PROPERTY (
TARGET libts3client PROPERTY IMPORTED_LOCATION
libs/ts3_sdk_3.0.4/bin/linux/amd64/libts3client.so)
你有一个普通的相对路径,这通常会导致CMake出现问题,因为它会在CMakeLists.txt
存在的目录下的不同目录中运行你的命令。
正如我们在评论中发现的那样,将IMPORTED_LOCATION
更改为绝对路径会修复它。但是,正确的解决方案是使用具有已知基数的相对路径:
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
文件所在的目录下。