CMake erreur de couplage (undefined reference to)
Je travaille avec le SSL-logiciel de Vision. Il a un exemple de client que j'ai essayé de le séparer de l'ensemble du projet. J'ai trouvé les sources nécessaires pour modifier un client moi-même, alors j'ai juste copié à partir du logiciel et utilisé CMake pour construire mon client.
La structure du projet ci-dessous est simplifié, se rétrécissant à la question (je crois!).
.
├── 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)
projet( TestClient )find_package( PkgConfig REQUIS )
pkg_check_modules( QTCORE_PKG QtCore )
include_directories( ${QTCORE_PKG_INCLUDE_DIRS} )inclure(FindProtobuf)
find_package( Protobuf REQUIS )
include_directories( ${PROTOBUF_INCLUDE_DIRS} )find_package( PkgConfig REQUIS )
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 PARTAGÉ messages_robocup_ssl_detection.pb.cc )
add_library( messages_robocup_ssl_refbox_log.pb PARTAGÉ messages_robocup_ssl_refbox_log.pb.cc )
add_library( messages_robocup_ssl_geometry.pb PARTAGÉ messages_robocup_ssl_geometry.pb.cc )
add_library( messages_robocup_ssl_wrapper.pb PARTAGÉ messages_robocup_ssl_wrapper.pb.cc )
Il pourrait être un manque #include dans le messages_ssl_...
fichiers, mais ils sont tous auto-généré et semble être correct.
Dans messages_robocup_ssl_detection.pb.h
et messages_robocup_ssl_detection.pb.h
il y a seulement protobuf comprend.
Dans messages_robocup_ssl_refbox_log.pb.h
:
#include "messages_robocup_ssl_detection.pb.h"
//Other protobuf includes
Dans messages_robocup_ssl_wrapper.h
:
#include "messages_robocup_ssl_detection.pb.h"
#include "messages_robocup_ssl_geometry.pb.h"
//Other protobuf includes
Dans chaque .cc fichier est inclus uniquement son en-tête et d'autres protobuf libs.
Enfin, quand je le fais faire, l'erreur suivante est générée:
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
J'ai essayé de résoudre ce problème pour un certain temps.
Pourquoi le libmessages_robocup_ssl_wrapper.pb.so
montrant les erreurs si il a déjà été construit avant le lien?
Si il n'y a aucune information supplémentaire est nécessaire, il suffit de demander!
OriginalL'auteur Lucas | 2013-05-15
Vous devez vous connecter pour publier un commentaire.
Il pourrait bien être le lien entre l'ordre.
Il ressemble
messages_robocup_ssl_wrapper.pb
dépendmessages_robocup_ssl_geometry.pb
. Si oui, l'emballage doit venir avant de la géométrie dans la ligne de liaison.Encore mieux, laissez CMake prendre soin de dépendances comme ça.
Si vous ajoutez...
puis CMake conserve automatiquement que la dépendance lors de la
messages_robocup_ssl_wrapper.pb
est spécifié en tant que dépendance d'une autre cible. Si vous le faites, alors vous pouvez choisir d'omettremessages_robocup_ssl_geometry.pb
de latarget_link_libraries( clientTest ... )
appel.messages_robocup_ssl_wrapper.pb
dépendmessages_robocup_ssl_geometry.pb
à partir de maintenant. Merci!!!!De bonnes choses. Content que vous vous êtes fixé.
OriginalL'auteur Fraser
Une autre raison pour
undefined reference to ...
peut être une fonction marquéeinline
dans un fichier source qui n'est pas un en-tête. Lorsque l'optimisation est activée, le compilateur peut effectivement inline de la fonction et passez de générer le symbole conduisant à l'erreur.Pour ce cas, la solution est de déplacer les fonctions inline pour les en-têtes ou de supprimer la ligne de la marque.
OriginalL'auteur Helmut
Encore une autre raison d'observer cette erreur, peut-être une commune de moins bien, c'est que l'ABIs ne sont pas compatibles.
Par exemple, l'un des l'un des fichiers de la bibliothèque pourrait être construit avec le drapeau
-D_GLIBCXX_USE_CXX11_ABI=0
alors que le projet n'est pas. Cela peut être désagréable pour déboguer, surtout lorsqu'il n'est pas conscient que cela peut-être le problème.Je me rends compte que ce n'est pas la question dans votre scénario spécifique, mais cette réponse pourrait aider d'autres trébuchant sur elle.
OriginalL'auteur Martin R.