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 (wo USB ist der name der library-Datei, ohne die lib Teil). Wenn nicht, dann machen Sie eine Vermutung, wo er ist, bitten Sie den Benutzer (durch eine CMake-cache-variable), oder verwenden Sie find_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

InformationsquelleAutor Segfault | 2016-01-25
Schreibe einen Kommentar