J'essaie de compiler un code et j'obtiens l'erreur
référence non définie à
boost::program_options::options_description::m_default_line_length
J'utilise g ++ dans Ubuntu 12.04. Bien que j'aie fait de la programmation C++, je suis nouveau dans l'environnement de développement Linux (utilisé auparavant uniquement par les IDE).
J'ai donc effectué une recherche élémentaire sur ce problème et trouvé des problèmes de liaison. Je ne les ai pas bien compris car je suis un débutant. La lecture de certaines de ces solutions m'a encore plus perturbé. Mon dossier de bibliothèque boost est dans /usr/include
. Certaines solutions indiquent qu'il devrait être en /usr/lib
. Mais je n'ai pas de dossier de boost là-bas.
Que dois-je changer?
Si vous avez installé boost from repo, utilisez simplement -lboost_program_options
, cela suffira.
Si vous avez installé des bibliothèques boost dans une autre bibliothèque, vous devez spécifier cette direction par -L/path/to/lib
Dans CMake, vous pouvez spécifier set(CMAKE_CXX_FLAGS "-lboost_program_options")
Cependant, avec CMake, vous devriez utiliser
FIND_PACKAGE(Boost COMPONENTS program_options REQUIRED)
INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS})
TARGET_LINK_LIBRARIES(target ${Boost_LIBRARIES})
Des modifications de la classe <string>
dans la norme C++ 11 peuvent entrer en conflit avec les versions de la bibliothèque Boost compilées avec un compilateur non C++ 11 (tel que G ++ - 4.8). Essayez de recompiler boost ou utilisez une version du compilateur C++ utilisée pour compiler vos bibliothèques Boost.
Vérifiez également que le paramètre de la variable de pré-processeur _GLIBCXX_USE_CXX11_ABI
est identique au paramètre de la variable qui a été utilisée pour la compilation boost. Le paramètre par défaut de la variable peut être différent selon la distribution Linux et la version du compilateur GNU utilisée.
Voir Dual ABI pour plus d'informations.
Où sont les librairies boost (fichiers se terminant par .so et .a)? Trouvez-les, puis ajoutez-les à votre commande de lien: -L/chemin/vers/boost/libs -lname-of-boost-lib
Ceci doit être le problème le plus courant rencontré par les personnes lors du premier démarrage de c ++. Il existe probablement un millier d'autres questions de référence non définies sur SO. Il suffit de rechercher une référence non définie.
Les bibliothèques sont normalement installées dans /usr/lib
(par exemple, /usr/lib/x86_64-linux-gnu/libboost_program_options.so.1.58.0
sur mon système).
Afin de compiler le code destiné à être lié à ces bibliothèques, vous utilisez normalement les fichiers d’en-tête, fournis dans /usr/include
.
Contrairement à beaucoup de bibliothèques, Boost ne vient pas avec les fichiers pkg-config, vous devez donc ajouter vous-même les indicateurs de l'éditeur de liens. Avec les règles habituelles de Makefile, vous aurez besoin de quelque chose comme LDLIBS += -lboost_program_options
.
Notez également que, bien que le package libboost-dev
fournisse les en-têtes de program_options
, vous devez également installer libboost-program-options-dev
pour obtenir la bibliothèque correspondante.