Wie verlinke ich eine Drittanbieter-Bibliothek (LibUSB) in CMake
Ich bin versucht, LibUSB in einem Projekt. Aber immer wenn ich Versuch die grundlegenden libUSB Funktionen bekomme ich die folgende Fehlermeldung:
...src/main/main.cpp.o: In function `main':
...src/main/main.cpp:10: undefined reference to `libusb_init'
...src/main/main.cpp:11: undefined reference to `libusb_set_debug'
collect2: error: ld returned 1 exit status
Das Paket LibUSB-devel installiert ist (ich bin auf fedora 22) und meine IDE KDevelop findet und erkennt die Header, auf den Punkt, es bietet LibUSB-code-Abschlüsse, die, sobald Sie Hinzugefügt haben, können Sie die import-Anweisung. Ich habe keine benutzerdefinierte include-Zeilen in entweder meine IDE-oder CMake (mein build-system), so würde ich gerne wissen, was ich brauche, um zu machen CMake finden Sie die LibUSB Header.
Dies ist der Inhalt von main.cpp
, falls ich etwas Durcheinander:
#include <iostream>
#include <libusb-1.0/libusb.h>
int main(int argc, char **argv) {
libusb_init(NULL);
libusb_set_debug(NULL, LIBUSB_LOG_LEVEL_WARNING);
/*snip*/
std::cout << "Hello, world! PTPID=" << std::endl;
return 0;
}
Im folgenden sind die CMakeLists.txt
:
../
cmake_minimum_required(VERSION 2.8.11)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(CMAKE_BUILD_TYPE Debug)
project(aProjectThatHasHadIt'sNameObcured)
add_subdirectory(src)
.../src/cmakelists.txt fügt nur Unterverzeichnisse
.../src/main/
add_executable(main main.cpp)
- Undefinierte Referenzen sind linker-Fehler, so dass Sie über die Suche nach Bibliotheken, nicht Header. Vielleicht können Sie zeigen, wie Ihr Projekt verwendet CMake link gegen die LibUSB?
- Sind Sie auf der Verknüpfung der Binärdateien, die von libusb?
- sieht aus wie Sie sind misisng einige linkerflags für libusb
- CMake ist kein link gegen LibUSB ich nahm die Annahme, dass die devel-Paket würde das Zeug in den Standard-include-Pfad. Ich vermute jetzt, dass das falsch ist?
- Es gibt einen Unterschied zwischen include-Pfade (wo-Header gespeichert sind) und Bibliotheken. Sie müssen explizit konfigurieren Sie Ihre autotools-zu-link-gegen-Bibliotheken, die Sie verwenden. Ich sehe nicht
target_link_libraries()
aufrufen in den CMake-code, Sie sind also offensichtlich nicht die Verlinkung gegen die LibUSB. - Ich bin eindeutig andernfalls bei der Verwendung von google heute, denn ich kann nicht finden, die relevanten Informationen, Wie mache ich einen link gegen eine externe libraray wie LibUSB? Nehmen wir an ich weiß nicht, wo DNF installiert es.
- Wenn es installiert ist, in der "standard" Position, wie Sie erwarten,
target_link_libraries(main USB)
sollte den trick tun (woUSB
ist der name der library-Datei, ohne dielib
Teil). Wenn nicht, dann machen Sie eine Vermutung, wo er ist, bitten Sie den Benutzer (durch eine CMake-cache-variable), oder verwenden Siefind_library()
. - Die eigentliche Frage ist "Wie man richtig link mit 3d-party-Bibliothek in CMake", nicht über "Was ist undefined reference in C/C++ im Allgemeinen", die beschrieben wird in der referenzierten Frage. [Aber der Titel ist definitiv schlecht]. Gegeben Frage könnte gute Basis für die nette Antwort, die viele von CMake Anfänger (und nicht nur Sie) suchen. Habe für wieder öffnen.
- Ich habe der überschrift verbessert
Du musst angemeldet sein, um einen Kommentar abzugeben.
Aus Ihren Projekten
CMakeLists.txt
- Datei, die es nicht ersichtlich, um mich, wie Sie versucht haben, zu verknüpfen libusb. Die Art, wie ich tun würde, ist die folgende:target_link_libraries(project_name <other_dependencies> usb-1.0)
(Nur um klarzustellen, ich meine die CMakeLIsts.txt Datei, in die Sie Ihre ausführbare Datei)
Die Sie importieren möchten, aus
<libusb-1.0/...>
so müssen Sie diese Verbindung mit usb-1.0 (die lib ist immer ausgelassen linker-Befehle!)Bin ich auf Fedora 23, auch mit KDevelop und ich habe nicht einen Pfad angeben. Vor allem, weil auf meinem system alle Variablen verwendet, die in der vorherigen Antwort sind sowieso NULL.
Und zu bestätigen, wo und wie eine Bibliothek installiert ist, in der Zukunft können Sie nur:
locate libusb | grep .so
Ich hoffe, das war einigermaßen hilfreich.
In der Regel, um link eine Drittanbieter-Bibliothek, müssen Sie das include-Verzeichnis, wo der compiler sucht nach der Header und die Bibliotheken, die vom linker verwendet.
Zum hinzufügen von include-Verzeichnisse verwenden
target_include_directories
zum hinzufügen einer library gelinkt werden, um ein Ziel verwendentarget_link_libraries
.Für libUSB und ein
testLibUSB.cpp
source-Datei das Ergebnis wäreWenn Sie mehrere Ziele, die Sie möglicherweise verwenden möchten
include_directories
undlink_libraries
vor der Festlegung von Ziel. Diese Befehle gelten für alle Ziele in einem Projekt, nachdem Sie eingestellt sind, und speichern Sie eine Menge von WiederholungKönnen Sie die Pfade für
LIBUSB_INCLUDE_DIR
undLIBUSB_LIBRARY
von hand. Aber mehr flexibel und tragbar, ist die Verwendung von CMake gebaut-in-Mechanismen zu finden, die Header und Bibliotheken.Header durchsucht werden können, indem
find_path
und Bibliotheken, die vonfind_library
.in Ihrem Fall könnte dies
Den
PATH_SUFFIXES
sind optional. Wenn Sie installiert haben die Bibliothek in einem Standard-Speicherort, CMake wird diese automatisch finden. Ansonsten geben SieCMAKE_PREFIX_PATH
und CMake Aussehen wird für die Header und Bibliotheken gibt, auch. Sie können die variable, entweder, indem Sie es in den CMake-GUI oder das hinzufügen-DCMAKE_PREFIX_PATH=/path/to/add
zu Ihrem CMake-Aufruf.Ein häufiger Fehler ist nicht zu löschen CMakeCache.txt die Datei in das build-Verzeichnis. CMake speichert die Werte für
LIBUSB_INCLUDE_DIR
undLIBUSB_LIBRARY
und wenn Sie macht die Anpassung an die Präfix-Pfad oder Ihre Suche Logik, die es noch nicht auswerten der Variablen Werte, sondern hält sich an die zwischengespeicherten Werte.include_directories
ist sehr viel häufiger alstarget_include_directories
vor allem für CMake Anfänger. Der Letzte Absatz beschreibt eigentlich debugging - Prozess für der Entwickler - sollte es nicht getrennt werden irgendwie von "Wie schreibt CMake script" Inhalte?include_directories
auch. Sie haben Recht, dass das caching ist eine Art von nicht verwandten, aber es ist ein häufiges Problem. Das ist, warum ich bin, es zu erwähnen.