2016-04-16 3 views
1

Ich habe das libtins-Paket für C++ installiert, indem ich es wie beschrieben erstellt habe und #include <tins/tins.h> dem Header der Beispieldatei hinzugefügt habe. Ich lief ldconfig aber Gebäude werfen immer einen undefinierten Referenzfehler:C++ undefinierte Referenz für die libtins-Bibliothek

CMakeFiles/lts.dir/main.cpp.o: In function `main': 
/home/patrick/ClionProjects/lts/main.cpp:6: undefined reference to `Tins::EthernetII::EthernetII(Tins::HWAddress<6ul, unsigned char> const&, Tins::HWAddress<6ul, unsigned char> const&)' 
/home/patrick/ClionProjects/lts/main.cpp:7: undefined reference to `Tins::IPv4Address::IPv4Address(char const*)' 
/home/patrick/ClionProjects/lts/main.cpp:7: undefined reference to `Tins::IPv4Address::IPv4Address(char const*)' 
/home/patrick/ClionProjects/lts/main.cpp:7: undefined reference to `Tins::IP::IP(Tins::IPv4Address, Tins::IPv4Address)' 
/home/patrick/ClionProjects/lts/main.cpp:8: undefined reference to `Tins::TCP::TCP(unsigned short, unsigned short)' 
/home/patrick/ClionProjects/lts/main.cpp:10: undefined reference to `Tins::PDU::inner_pdu(Tins::PDU*)' 
/home/patrick/ClionProjects/lts/main.cpp:12: undefined reference to `Tins::PDU::inner_pdu(Tins::PDU*)' 
CMakeFiles/lts.dir/main.cpp.o: In function `Tins::EthernetII::~EthernetII()': 
/usr/local/include/tins/ethernetII.h:46: undefined reference to `vtable for Tins::EthernetII' 
/usr/local/include/tins/ethernetII.h:46: undefined reference to `Tins::PDU::~PDU()' 
collect2: error: ld returned 1 exit status 
make[3]: *** [lts] Error 1 

ich CLion als IDE verwenden und die folgende cmake-Datei:

cmake_minimum_required(VERSION 3.5) 
project(lts) 

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -ltins") 

set(SOURCE_FILES main.cpp) 

add_executable(lts ${SOURCE_FILES}) 

Jede Idee, was das Problem sein könnte?

Antwort

2

Es gibt ein paar Dinge in Ihrer Frage zu behandeln. Lassen Sie zuerst CMake den Speicherort der libtins-Bibliothek für Sie suchen und verwenden Sie dann target_link_libraries(), um es zu Ihrer ausführbaren Datei lts hinzuzufügen. Im CMake-Beispiel in Ihrer Frage geben Sie Bibliotheksoptionen in der Compiler-Flag-Variable (CMAKE_CXX_FLAGS) an. Die andere Sache ist, dass auch CMake die passenden Compiler-Flags für C++ 11 setzt, anstatt sie manuell zu CMAKE_CXX_FLAGS hinzuzufügen (was nur den Compiler-Teil, aber nicht den Linker betrifft). Die folgende Beschreibung ist zu tun, was Sie wollen in einem robusten, plattformunabhängige Art und Weise:

cmake_minimum_required(VERSION 3.5) 

set(CMAKE_CXX_STANDARD 11) 
set(CMAKE_CXX_STANDARD_REQUIRED ON) 

project(lts) 

find_library(TINS_LIBRARY tins) 

set(SOURCE_FILES main.cpp) 
add_executable(lts ${SOURCE_FILES}) 

target_link_libraries(lts "${TINS_LIBRARY}") 

Ich empfehle Ihnen, die CMake docs lesen für find_library() und target_link_libraries() zu verstehen, was diese Befehle zu tun. Für die C++ 11-Sachen empfehle ich this blog article für eine zusammenhängendere Erklärung als das, was die CMake-Dokumente Ihnen geben (Enthüllung: Ich schrieb den Artikel).

0

Der Compiler sollte -ltins. Informationen zum Hinzufügen von Bibliotheksabhängigkeiten finden Sie im CMake-Handbuch.

2

Die CMake-Variable CMAKE_CXX_FLAGS ist für den Compiler Flags, nicht für Bibliotheken.

Um eine Bibliothek hinzufügen Sie target_link_libraries verwenden sollten:

target_link_libraries(lts tins) 

Wenn Sie alle Ziele derselben Bibliothek verknüpfen möchten, sollten Sie es in die Liste CMAKE_STANDARD_LIBRARIES hinzuzufügen.


Eine kleine Spitze diese Art von Dingen auf Debuggen: set Entweder CMAKE_VERBOSE_MAKEFILE oder make VERBOSE=1 verwenden die normalen CMake bauen Ausgang, zu hemmen und stattdessen die normale make Ausgabe anzuzeigen, die Ihnen alle Befehle make Läufe zeigen, und alle Flags und Optionen, die für jedes Programm verwendet werden. Auf diese Weise können Sie sehen, dass das Flag -ltins als Compiler-Flag übergeben wird, aber nicht als Linker-Flag oder -Bibliothek.