CMake-linking-Fehler (undefined reference to)
Arbeite ich mit der SSL-Vision-software. Er hat ein Beispiel-client, die ich versucht habe zu trennen vom ganzen Projekt. Ich fand die Quellen, die erforderlich sind, um Bearbeiten ein client selbst, so dass ich nur kopiert von der software und verwendet CMake zum bauen meine Kunden.
Dem Projekt folgende Struktur wird vereinfacht, die Verengung auf das Thema (ich glaube!).
.
├── CMakeLists.txt
├── main.cc
├── build
│ ├── CMakeLists.txt
│ └── messages_ssl_... (.cc/.h, 4 each)
└── src
├── CMakeLists.txt
└── (Other subdirs and sources/headers)
./CMakeLists.txt:
cmake_minimum_required(VERSION 2.6)
Projekt( TestClient )find_package( PkgConfig ERFORDERLICH )
pkg_check_modules( QTCORE_PKG QtCore )
include_directories( ${QTCORE_PKG_INCLUDE_DIRS} )gehören(FindProtobuf)
find_package( Protobuf ERFORDERLICH )
include_directories( ${PROTOBUF_INCLUDE_DIRS} )find_package( PkgConfig ERFORDERLICH )
pkg_check_modules( GLIB_PKG glib-2.0 )
include_directories( ${GLIB_PKG_INCLUDE_DIRS} )include_directories( "src" ) add_subdirectory( src )
include_directories( "build" ) add_subdirectory( build )
add_executable( clientTest clientTest.cc )
target_link_libraries( clientTest robocup_ssl_client
messages_robocup_ssl_detection.pb messages_robocup_ssl_geometry.pb
messages_robocup_ssl_wrapper.pb messages_robocup_ssl_refbox_log.pb
netraw robocup_ssl_client protobuf QtCore )
./build/CMakeLists.txt:
add_library( messages_robocup_ssl_detection.pb FREIGEGEBEN messages_robocup_ssl_detection.pb.cc )
add_library( messages_robocup_ssl_refbox_log.pb FREIGEGEBEN messages_robocup_ssl_refbox_log.pb.cc )
add_library( messages_robocup_ssl_geometry.pb FREIGEGEBEN messages_robocup_ssl_geometry.pb.cc )
add_library( messages_robocup_ssl_wrapper.pb FREIGEGEBEN messages_robocup_ssl_wrapper.pb.cc )
Könnte es eine fehlende #include in der messages_ssl_...
- Dateien, aber Sie sind alle automatisch generiert und scheint richtig zu sein.
In messages_robocup_ssl_detection.pb.h
und messages_robocup_ssl_detection.pb.h
es gibt nur protobuf umfasst.
In messages_robocup_ssl_refbox_log.pb.h
:
#include "messages_robocup_ssl_detection.pb.h"
//Other protobuf includes
In messages_robocup_ssl_wrapper.h
:
#include "messages_robocup_ssl_detection.pb.h"
#include "messages_robocup_ssl_geometry.pb.h"
//Other protobuf includes
In jedem .cc-Datei enthalten ist, nur die header und andere protobuf libs.
Schließlich, wenn ich machen, der folgende Fehler wird generiert:
Linking CXX executable clientTest
build/libmessages_robocup_ssl_wrapper.pb.so: undefined reference to `SSL_GeometryData::ByteSize() const'
build/libmessages_robocup_ssl_wrapper.pb.so: undefined reference to `SSL_GeometryData::MergeFrom(SSL_GeometryData const&)'
build/libmessages_robocup_ssl_wrapper.pb.so: undefined reference to `protobuf_AddDesc_messages_5frobocup_5fssl_5fgeometry_2eproto()'
build/libmessages_robocup_ssl_wrapper.pb.so: undefined reference to `SSL_GeometryData::Clear()'
build/libmessages_robocup_ssl_wrapper.pb.so: undefined reference to `SSL_GeometryData::SSL_GeometryData()'
build/libmessages_robocup_ssl_wrapper.pb.so: undefined reference to `SSL_GeometryData::default_instance()'
build/libmessages_robocup_ssl_wrapper.pb.so: undefined reference to `SSL_GeometryData::SerializeWithCachedSizesToArray(unsigned char*) const'
build/libmessages_robocup_ssl_wrapper.pb.so: undefined reference to `SSL_GeometryData::MergePartialFromCodedStream(google::protobuf::io::CodedInputStream*)'
collect2: ld returned 1 exit status
make[2]: ** [clientTest] Erro 1
make[1]: ** [CMakeFiles/clientTest.dir/all] Erro 2
make: ** [all] Erro 2
Ich habe versucht, dies zu beheben, für einige Zeit.
Warum ist die libmessages_robocup_ssl_wrapper.pb.so
zeigt Fehler, wenn es bereits gebaut, bevor der Verknüpfung?
Wenn es irgendeine zusätzliche Informationen benötigt, einfach Fragen!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnte es gut sein, das die Verknüpfung um.
Sieht es aus wie
messages_robocup_ssl_wrapper.pb
hängtmessages_robocup_ssl_geometry.pb
. Wenn ja, wrapper kommen sollte vor geometrie in die link-Zeile an.Sogar besser, lassen sich CMake kümmern Abhängigkeiten wie diese.
Wenn Sie hinzufügen...
dann CMake automatisch das festhalten an der Abhängigkeit, wenn
messages_robocup_ssl_wrapper.pb
angegeben ist, als eine Abhängigkeit von einem anderen Ziel. Wenn Sie dies tun, dann können Sie weglassenmessages_robocup_ssl_geometry.pb
von dertarget_link_libraries( clientTest ... )
nennen.messages_robocup_ssl_wrapper.pb
hängtmessages_robocup_ssl_geometry.pb
von nun an. Danke!!!Ein weiterer Grund für
undefined reference to ...
werden kann, eine Funktion markiert alsinline
in einer Quellcode-Datei, die nicht einen header. Wenn die Optimierung aktiviert ist, kann der compiler eigentlich inline-Funktion und überspringen Sie generieren das symbol zu dem Fehler führen.Für diesen Fall die Lösung ist, entweder verschieben Sie die inline-Funktionen zu Kopf-oder entfernen Sie den inline-mark.
Noch ein weiterer Grund, dies zu beobachten, Fehler, vielleicht ein weniger verbreitet, obwohl, ist, dass ABIs sind nicht kompatibel.
Zum Beispiel, eine der eine der library-Dateien gebaut werden konnte mit der Flagge
-D_GLIBCXX_USE_CXX11_ABI=0
während das Projekt nicht. Das kann fies zu Debuggen, vor allem wenn es nicht bewusst ist, dass dies das problem sein.Ich feststellen, dass dies nicht das Problem in Ihrem spezifischen Szenario, aber diese Antwort könnte helfen, andere stolpern auf es.