2013-05-15 35 views
9

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!

risposta

14

Potrebbe benissimo essere l'ordine di collegamento.

Sembra che messages_robocup_ssl_wrapper.pb dipende da messages_robocup_ssl_geometry.pb. In tal caso, il wrapper deve essere prima della geometria nella riga di collegamento.

target_link_libraries(clientTest robocup_ssl_client 
         messages_robocup_ssl_detection.pb 
         messages_robocup_ssl_wrapper.pb 
         messages_robocup_ssl_geometry.pb 
         messages_robocup_ssl_refbox_log.pb 
         netraw 
         robocup_ssl_client 
         protobuf 
         QtCore) 

Ancora meglio, lasciare che CMake si occupi delle dipendenze come questa.

Se si aggiunge ...

target_link_libraries(messages_robocup_ssl_wrapper.pb 
         messages_robocup_ssl_geometry.pb) 

poi CMake manterrà automaticamente che la dipendenza quando messages_robocup_ssl_wrapper.pb viene specificato come dipendenza di un altro bersaglio. Se si esegue questa operazione, è possibile scegliere di omettere messages_robocup_ssl_geometry.pb dalla chiamata target_link_libraries(clientTest ...).

+0

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

+0

Roba buona. Sono contento di averlo sistemato. – Fraser

3

Un altro motivo per undefined reference to ... può essere una funzione contrassegnata come inline in un file di origine che non è un'intestazione. Quando l'ottimizzazione è abilitata, il compilatore può in realtà incorporare la funzione e saltare la generazione del simbolo che porta all'errore.

In questo caso, la soluzione è spostare le funzioni inline sulle intestazioni o rimuovere il segno inline.

Problemi correlati