2017-09-24 1 views
0

J'ai tenté de résoudre ce problème, mais finalement j'ai abandonné et je ne peux pas le comprendre. J'utilise CLion et j'ai besoin d'importer une bibliothèque partagée externe (ts3client.so). Quoi que je fasse, il échoue d'une manière ou d'une autre.Aucune règle pour makefile cible lors de l'utilisation d'une bibliothèque externe

Actuellement, je donne les résultats suivants:

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) 

Cela me donne l'erreur suivante:

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 

Ma structure de répertoire est la suivante: src/main.cpp (le code) libs/ts3_sdk_3.0.4/include/teamspeak/(qui contient les en-têtes pour la bibliothèque) libs/ts3_sdk_3.0.4/bin/linux/amd64/libts3client.so (qui est la bibliothèque que je ne peux pas importer).

+0

Essayez d'utiliser un chemin absolu pour libts3client.so et voyez si cela fonctionne. –

+0

@JohnZwinck oui, il a fait son travail. Savez-vous pourquoi c'est le cas? –

Répondre

1

Le problème est ici:

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

Vous avez un chemin relatif plaine là, qui provoquent souvent des problèmes avec CMake, car il exécutera vos commandes dans des répertoires différents que celui où CMakeLists.txt existe.

Comme nous l'avons découvert dans un commentaire, la modification du IMPORTED_LOCATION en un chemin absolu le corrige. Cependant, la bonne solution est d'utiliser un chemin relatif avec une base connue:

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

Cela dit explicitement que le répertoire libs se trouve sous le répertoire dans lequel ce fichier est CMakeLists.txt.