web-dev-qa-db-fra.com

Lier une bibliothèque partagée à CMake

J'essaie de créer un lien dans un fichier de bibliothèque partagée précompilé appelé libtest-lib.so. Voici ce que j'ai au bas de mon CMakeLists.txt:

link_directories("/projectspath/LinkTest/TestLib/app/build/intermediates/cmake/debug/obj/armeabi-v7a")

add_library(testlib libtest-lib.so)

target_link_libraries(testlib libtest-lib.so)

Comme ci-dessus, j'obtiens l'erreur suivante:

CMake Error at CMakeLists.txt:49 (add_library):
  Cannot find source file:
    libtest-lib.so
  Tried extensions .c .C .c++ .cc .cpp .cxx .m .M .mm .h .hh .h++ .hm     .hpp
  .hxx .in .txx
 CMake Error: CMake can not determine linker language for target:    testlib

Si je commente la ligne add_library, j'obtiens ce qui suit:

CMake Error at CMakeLists.txt:51 (target_link_libraries):
Cannot specify link libraries for target "testlib" which is not built by this project.

Il semble que les fichiers sources (.c, cpp, etc.) soient absolument nécessaires lors de la liaison dans une bibliothèque. Mais comment puis-je créer un lien dans un fichier .so? Les documents disent ce qui suit à propos de target_link_libraries ():

Le nom doit avoir été créé dans le répertoire actuel par une commande telle que add_executable () ou add_library ().

Si je substitue add_library () avec add_executable (), j'obtiens la même erreur. Quelle est la bonne façon de lier un fichier .so dans CMake?

2
Dimitri Lozovoy

Je pense que ce que vous voulez, c'est importer une bibliothèque pour CMake:

 add_library(testlib SHARED IMPORTED)
 set_property(TARGET testlib PROPERTY IMPORTED_LOCATION "/projectspath/LinkTest/TestLib/app/build/intermediates/cmake/debug/obj/armeabi-v7a/libtest-lib.so")

https://cmake.org/Wiki/CMake/Tutorials/Exporting_and_Importing_Targets pour plus d'informations

6
oLen

add_library crée une nouvelle bibliothèque. 

Au lieu de cela, vous souhaitez lier votre bibliothèque à une autre cible. 

Disons 

add_executable(main main.cpp)
target_link_libraries(main libtest-lib)

Cela devrait déjà fonctionner. 

2
Unapiedra

Tu aurais dû: 

link_directories("/projectspath/LinkTest/TestLib/app/build/intermediates/cmake/debug/obj/armeabi-v7a")
set(MY_SOURCES mylib.cpp)
add_library(testlib ${MY_SOURCES})
target_link_libraries(testlib libtest-lib)

ce qui signifie que vous devez spécifier les sources de VOTRE bibliothèque en tant que second argument de add_library() ou add_executable() et non de la bibliothèque déjà compilée.
Vous avez besoin de vos sources car vous construisez généralement quelque chose (une bibliothèque ou un exécutable) qui nécessite un lien vers une bibliothèque existante.
Sinon, que construiriez-vous? Rien? Et lier la bibliothèque à quoi? Qui serait le consommateur de cette bibliothèque?

0
fedepad

J'ai trouvé une autre solution de contournement, mentionner le chemin où la bibliothèque est présente lors de la liaison de lib au fichier exécutable.

INCLUDE_DIRECTORIES(/path/to/headers)     
ADD_EXECUTABLE(TARGET target.c)     
TARGET_LINK_LIBRARIES(TARGET_FILE "-L/path/to/shared/library" SHARED_LIB_name)

Ce qui est indirect, y compris le drapeau du chemin de recherche de la bibliothèque. Il peut également être nécessaire de lier l’emplacement des fichiers d’en-tête lors de l’utilisation de la bibliothèque. 

0