使用外部库

时间:2017-09-24 02:00:51

标签: 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_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(这是我无法导入的库)。

1 个答案:

答案 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文件所在的目录下。