2017-01-13 2 views
2

Ich versuche, in einer vorkompilierten freigegebenen Bibliotheksdatei namens libtest-lib.so zu verknüpfen. Dies ist, was ich am Ende meines CMakeLists.txt haben:Verknüpfen Sie eine gemeinsam genutzte Bibliothek mit CMake

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) 

Wie oben, bekomme ich folgende Fehlermeldung:

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 

Wenn ich die add_library Zeile aus kommentieren, erhalte ich die folgende:

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

Es scheint, dass Quelldateien (.c, CPP, usw.) sind absolut, wenn sie in einer Bibliothek Verknüpfung erforderlich. Aber wie verknüpfe ich eine .so-Datei? Die Dokumentation sagt folgendes über target_link_libraries():

Der Name muss im aktuellen Verzeichnis durch einen Befehl wie add_executable() oder add_library() erstellt worden sein.

Wenn ich add_library() mit add_executable() ersetzen, bekomme ich den gleichen Fehler. Was ist der richtige Weg, um eine .so-Datei in CMake zu verknüpfen?

Antwort

1

sollten Sie haben:

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) 

was bedeutet, dass Sie die Quellen Ihrer Bibliothek als zweites Argument an add_library() oder add_executable() und nicht die Bibliothek, die bereits kompiliert angeben sollte.
Sie benötigen Ihre Quellen, da Sie im Allgemeinen etwas (eine Bibliothek oder eine ausführbare Datei) erstellen, das eine Verknüpfung mit einer bereits vorhandenen Bibliothek erfordert.
Sonst, was würden Sie bauen? Nichts? Und die Bibliothek mit was verbinden? Wer wäre der Verbraucher dieser Bibliothek?

+0

Aber ich don habe keine Quellen. Der springende Punkt ist, eine vorkompilierte .so-Datei zu verknüpfen. –

+1

? Sie möchten eine Bibliothek mit was verknüpfen? Nichts? – fedepad

0

add_library erstellt eine neue Bibliothek.

Stattdessen möchten Sie Ihre Bibliothek mit einem anderen Ziel verknüpfen.

sagen Lassen

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

Dies sollte bereits funktionieren.

4

Ich denke, dass das, was Sie wollen, eine Bibliothek für CMake zu importieren ist:

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 für weitere Informationen

+1

Dann ist der Titel der Frage völlig irreführend ... – fedepad

-3

Der richtige Weg, dies zu tun ist:

target_link_libraries(native-lib "/projectspath/LinkTest/TestLib/app/build/intermediates/cmake/debug/obj/${ANDROID_ABI}/libtest-lib.so") 
+5

Das ist definitiv nicht der richtige Weg. Sie geben niemals einen direkten Pfad ein, aber Sie finden die Bibliothek, speichern das Ergebnis in einer Variablen und übergeben die Variable an target_link_libraries. – usr1234567

+0

Natürlich ist es besser, es in eine Variable zu setzen. Der Punkt ist, das obige * funktioniert *, während keine der anderen Antworten tat. Sie klammern sich an nicht wesentliche Details. –

Verwandte Themen