# [C++] Erreurs en utilisant boost/program-options (résolu)

## Magic Banana

Bonsoir !

Cela fait des heures que j'essaie d'utiliser la bibliothèque boost/program-options.hpp mais j'ai des erreurs au linkage. À bout, je décide de tenter la compilation du fichier en exemple le plus simple : /usr/share/doc/libboost-doc/examples/libs/program_options/example/first.cpp (détaillé dans ce tutoriel). Mêmes erreurs !  :Evil or Very Mad: 

Voilà la procédure suivie et les erreurs obtenues lors de la compilation de first.cpp (ou plus exactement lors de la phase de link) :

```
$ sudo emerge boost

$ cp /usr/share/doc/libboost-doc/examples/libs/program_options/example/first.cpp .

$ g++ first.cpp 

/tmp/cc7SFuit.o: In function `main':

first.cpp:(.text+0xdd): référence indéfinie vers « boost::program_options::options_description::options_description(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int)»

first.cpp:(.text+0x188): référence indéfinie vers « boost::program_options::options_description::add_options()     »

first.cpp:(.text+0x1af): référence indéfinie vers « boost::program_options::options_description_easy_init::operator()(char const*, char const*)»

first.cpp:(.text+0x1d1): référence indéfinie vers « boost::program_options::options_description_easy_init::operator()(char const*, boost::program_options::value_semantic const*, char const*)»

first.cpp:(.text+0x1df): référence indéfinie vers « boost::program_options::variables_map::variables_map()»

first.cpp:(.text+0x244): référence indéfinie vers « boost::program_options::store(boost::program_options::basic_parsed_options<char> const&, boost::program_options::variables_map&, bool)»

first.cpp:(.text+0x2d1): référence indéfinie vers « boost::program_options::notify(boost::program_options::variables_map&)»

first.cpp:(.text+0x3b2): référence indéfinie vers « boost::program_options::operator<<(std::basic_ostream<char, std::char_traits<char> >&, boost::program_options::options_description const&)»

/tmp/cc7SFuit.o: In function `boost::program_options::value_semantic_codecvt_helper<char>::value_semantic_codecvt_helper()':

first.cpp:(.text._ZN5boost15program_options29value_semantic_codecvt_helperIcEC2Ev[boost::program_options::value_semantic_codecvt_helper<char>::value_semantic_codecvt_helper()]+0x12): référence indéfinie vers « vtable for boost::program_options::value_semantic_codecvt_helper<char>»

/tmp/cc7SFuit.o: In function `boost::program_options::value_semantic_codecvt_helper<char>::~value_semantic_codecvt_helper()':

first.cpp:(.text._ZN5boost15program_options29value_semantic_codecvt_helperIcED2Ev[boost::program_options::value_semantic_codecvt_helper<char>::~value_semantic_codecvt_helper()]+0x7): référence indéfinie vers « vtable for boost::program_options::value_semantic_codecvt_helper<char>»

/tmp/cc7SFuit.o: In function `boost::program_options::variables_map::~variables_map()':

first.cpp:(.text._ZN5boost15program_options13variables_mapD1Ev[boost::program_options::variables_map::~variables_map()]+0x8): référence indéfinie vers « vtable for boost::program_options::variables_map»

/tmp/cc7SFuit.o: In function `boost::program_options::validation_error::validation_error(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)':

first.cpp:(.text._ZN5boost15program_options16validation_errorC1ERKSs[boost::program_options::validation_error::validation_error(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)]+0x1a): référence indéfinie vers « vtable for boost::program_options::validation_error»

/tmp/cc7SFuit.o: In function `std::basic_string<char, std::char_traits<char>, std::allocator<char> > const& boost::program_options::validators::get_single_string<char>(std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&, bool)':

first.cpp:(.text._ZN5boost15program_options10validators17get_single_stringIcEERKSbIT_St11char_traitsIS3_ESaIS3_EERKSt6vectorIS7_SaIS7_EEb[std::basic_string<char, std::char_traits<char>, std::allocator<char> > const& boost::program_options::validators::get_single_string<char>(std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&, bool)]+0x160): référence indéfinie vers « typeinfo for boost::program_options::validation_error»

first.cpp:(.text._ZN5boost15program_options10validators17get_single_stringIcEERKSbIT_St11char_traitsIS3_ESaIS3_EERKSt6vectorIS7_SaIS7_EEb[std::basic_string<char, std::char_traits<char>, std::allocator<char> > const& boost::program_options::validators::get_single_string<char>(std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&, bool)]+0x285): référence indéfinie vers « typeinfo for boost::program_options::validation_error»

/tmp/cc7SFuit.o: In function `boost::program_options::validation_error::~validation_error()':

first.cpp:(.text._ZN5boost15program_options16validation_errorD1Ev[boost::program_options::validation_error::~validation_error()]+0x9): référence indéfinie vers « vtable for boost::program_options::validation_error»

/tmp/cc7SFuit.o: In function `boost::program_options::validation_error::~validation_error()':

first.cpp:(.text._ZN5boost15program_options16validation_errorD2Ev[boost::program_options::validation_error::~validation_error()]+0x9): référence indéfinie vers « vtable for boost::program_options::validation_error»

/tmp/cc7SFuit.o: In function `boost::program_options::validation_error::validation_error(boost::program_options::validation_error const&)':

first.cpp:(.text._ZN5boost15program_options16validation_errorC2ERKS1_[boost::program_options::validation_error::validation_error(boost::program_options::validation_error const&)]+0x1a): référence indéfinie vers « vtable for boost::program_options::validation_error»

/tmp/cc7SFuit.o: In function `void boost::program_options::validate<int, char>(boost::any&, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&, int*, long)':

first.cpp:(.text._ZN5boost15program_options8validateIicEEvRNS_3anyERKSt6vectorISbIT0_St11char_traitsIS5_ESaIS5_EESaIS9_EEPT_l[void boost::program_options::validate<int, char>(boost::any&, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&, int*, long)]+0xf): référence indéfinie vers « boost::program_options::validators::check_first_occurrence(boost::any const&)»

first.cpp:(.text._ZN5boost15program_options8validateIicEEvRNS_3anyERKSt6vectorISbIT0_St11char_traitsIS5_ESaIS5_EESaIS9_EEPT_l[void boost::program_options::validate<int, char>(boost::any&, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&, int*, long)]+0xc0): référence indéfinie vers « boost::program_options::invalid_option_value::invalid_option_value(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)»

/tmp/cc7SFuit.o: In function `boost::program_options::typed_value<int, char>::name() const':

first.cpp:(.text._ZNK5boost15program_options11typed_valueIicE4nameEv[boost::program_options::typed_value<int, char>::name() const]+0x68): référence indéfinie vers « boost::program_options::arg     »

first.cpp:(.text._ZNK5boost15program_options11typed_valueIicE4nameEv[boost::program_options::typed_value<int, char>::name() const]+0x103): référence indéfinie vers « boost::program_options::arg     »

/tmp/cc7SFuit.o: In function `std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > boost::program_options::to_internal<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&)':

first.cpp:(.text._ZN5boost15program_options11to_internalISsEESt6vectorISsSaISsEERKS2_IT_SaIS5_EE[std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > boost::program_options::to_internal<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&)]+0x55): référence indéfinie vers « boost::program_options::to_internal(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)»

/tmp/cc7SFuit.o: In function `boost::program_options::basic_command_line_parser<char>::basic_command_line_parser(int, char**)':

first.cpp:(.text._ZN5boost15program_options25basic_command_line_parserIcEC1EiPPc[boost::program_options::basic_command_line_parser<char>::basic_command_line_parser(int, char**)]+0x4f): référence indéfinie vers « boost::program_options::detail::cmdline::cmdline(std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&)»

/tmp/cc7SFuit.o: In function `boost::program_options::basic_command_line_parser<char>::options(boost::program_options::options_description const&)':

first.cpp:(.text._ZN5boost15program_options25basic_command_line_parserIcE7optionsERKNS0_19options_descriptionE[boost::program_options::basic_command_line_parser<char>::options(boost::program_options::options_description const&)]+0x14): référence indéfinie vers « boost::program_options::detail::cmdline::set_options_description(boost::program_options::options_description const&)»

/tmp/cc7SFuit.o: In function `boost::program_options::basic_command_line_parser<char>::style(int)':

first.cpp:(.text._ZN5boost15program_options25basic_command_line_parserIcE5styleEi[boost::program_options::basic_command_line_parser<char>::style(int)]+0x14): référence indéfinie vers « boost::program_options::detail::cmdline::style(int)»

/tmp/cc7SFuit.o: In function `boost::program_options::basic_command_line_parser<char>::extra_parser(boost::function1<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::allocator<boost::function_base> >)':

first.cpp:(.text._ZN5boost15program_options25basic_command_line_parserIcE12extra_parserENS_9function1ISt4pairISsSsERKSsSaINS_13function_baseEEEE[boost::program_options::basic_command_line_parser<char>::extra_parser(boost::function1<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::allocator<boost::function_base> >)]+0x27): référence indéfinie vers « boost::program_options::detail::cmdline::set_additional_parser(boost::function1<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::allocator<boost::function_base> >)»

/tmp/cc7SFuit.o: In function `boost::program_options::basic_command_line_parser<char>::run()':

first.cpp:(.text._ZN5boost15program_options25basic_command_line_parserIcE3runEv[boost::program_options::basic_command_line_parser<char>::run()]+0x2a): référence indéfinie vers « boost::program_options::detail::cmdline::run()  »

/tmp/cc7SFuit.o: In function `boost::program_options::variables_map::operator[](std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const':

first.cpp:(.text._ZNK5boost15program_options13variables_mapixERKSs[boost::program_options::variables_map::operator[](std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const]+0x14): référence indéfinie vers « boost::program_options::abstract_variables_map::operator[](std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const»

/tmp/cc7SFuit.o:(.rodata._ZTVN5boost15program_options11typed_valueIicEE[vtable for boost::program_options::typed_value<int, char>]+0x18): référence indéfinie vers « boost::program_options::value_semantic_codecvt_helper<char>::parse(boost::any&, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&, bool) const»

/tmp/cc7SFuit.o:(.rodata._ZTIN5boost15program_options11typed_valueIicEE[typeinfo for boost::program_options::typed_value<int, char>]+0x8): référence indéfinie vers « typeinfo for boost::program_options::value_semantic_codecvt_helper<char>»

/tmp/cc7SFuit.o:(.rodata._ZTIN5boost15program_options20invalid_option_valueE[typeinfo for boost::program_options::invalid_option_value]+0x8): référence indéfinie vers « typeinfo for boost::program_options::validation_error»

/tmp/cc7SFuit.o:(.rodata._ZTVN5boost15program_options20invalid_option_valueE[vtable for boost::program_options::invalid_option_value]+0x10): référence indéfinie vers « boost::program_options::validation_error::what() const»

collect2: ld returned 1 exit status
```

J'en arrive donc à me demander si cette bibliothèque n'est plus utilisable sur Gentoo... mais en fait non car sous Ubuntu Edgy Eft j'ai les mêmes erreurs !  :Rolling Eyes: 

Il me semble qu'un bogue dans la bibliothèque boost est aussi à exclure (puisque même le fichier en exemple le plus simple qui soit ne linke pas correctement).

Je ne vois plus où chercher...  :Crying or Very sad:  Quelqu'un parmi vous a déjà réussi à utiliser boost/program_options ?Last edited by Magic Banana on Sat Feb 24, 2007 11:05 pm; edited 1 time in total

----------

## Magic Banana

Vraiment personne ?  :Crying or Very sad: 

----------

## netfab

Salut,

 *Quote:*   

> 
> 
> $ g++ -lboost_program_options first.cpp
> 
> $ ./a.out
> ...

 

----------

## Magic Banana

Merci énormément netfab ! Cela fonctionne. J'ai beau avoir épluché http://www.boost.org/doc/html/program_options/ dans le détail, je n'ai pas lu qu'il fallait ajouter une option de compilation. Où as-tu trouvé cette information ?

----------

## netfab

Je te rassure, j'ai survolé la doc, je n'ai pas trouvé non plus.

D'autant qu'avec d'autres libs de boost, il n'y a pas besoin d'ajouter d'option pour linker.

J'ai simplement fait une recherche chez developpez.com sur les erreurs de link avec boost, et je suis tombé sur un topic où quelqu'un utilisait une option de linkage similaire pour boost::serialization (-lboost_serialization), et j'ai tenté.

----------

