Sto lavorando con il software SSL-Vision. Ha un client di esempio che ho cercato di separare da tutto il progetto. Ho trovato le fonti necessarie per modificare un client da solo, quindi li ho appena copiati dal software e ho utilizzato CMake per creare il mio client.Errore di collegamento CMake (riferimento non definito a)
La struttura del progetto di seguito è semplificata, restringendo il problema (credo!).
.
├── 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 (VERSIONE 2.6)
progetto (TestClient)find_package (pkgconfig RICHIESTO)
PKG_CHECK_MODULES (QTCORE_PKG QtCore)
include_directories ($ {QTCORE_PKG_INCLUDE_DIRS})includono (FindProtobuf)
find_package (Protobuf RICHIESTO)
include_directories ($ {PROTOBUF_INCLUDE_DIRS})find_package (pkgconfig RICHIESTO)
PKG_CHECK_MODULES (GLIB_PKG glib-2.0)
include_directories ($ {GLIB_PKG_INCLUDE_DIRS})include_directories ("src") add_subdirectory (src)
include_directories ("Buil d") 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 messages_robocup_ssl_detection.pb.cc CONDIVISO)
add_library (messages_robocup_ssl_refbox_log.pb messages_robocup_ssl_refbox_log.pb.cc CONDIVISO)
add_library (messages_robocup_ssl_geometry.pb messages_robocup_ssl_geometry.pb.cc CONDIVISO)
add_library (messages_robocup_ssl_wrapper.pb messages_robocup_ssl_wrapper.pb.cc CONDIVISO)
Potrebbe mancare #include nei file messages_ssl_...
, ma sono tutti generati automaticamente e sembrano essere corretti.
In messages_robocup_ssl_detection.pb.h
e messages_robocup_ssl_detection.pb.h
ci sono solo protobuf include.
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 ogni file .cc è incluso solo il suo colpo di testa e di altre librerie protobuf.
Infine, quando io faccio, viene generato il seguente errore:
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
Ho cercato di risolvere questo problema per qualche tempo. Perché lo libmessages_robocup_ssl_wrapper.pb.so
mostra errori se è già stato creato prima del collegamento?
Se sono necessarie ulteriori informazioni, basta chiedere!
Ha funzionato! Hai appena scambiato le righe come hai detto, e ha funzionato perfettamente. Ho anche aggiunto quelle due righe e CMake sa già che 'messages_robocup_ssl_wrapper.pb' dipende da' messages_robocup_ssl_geometry.pb' da ora in poi. Grazie! – Lucas
Roba buona. Sono contento di averlo sistemato. – Fraser