2011-12-28 10 views
7

he instalado impulso en ubuntu 10.04 porerror de enlace en el código program_options con la biblioteca de impulso en ubuntu

sudo apt-get install libboost-dev 

Creo que después de que yo no necesito que establezca ninguna opciones -I y -L, así que mi compilar código de

g++ test.cpp 

Aquí está mi test.cpp

#include <iostream> 
#include <string> 
#include <set> 
#include <sstream> 

#include <boost/config.hpp> 
#include <boost/program_options/detail/config_file.hpp> 
#include <boost/program_options/parsers.hpp> 

namespace pod = boost::program_options::detail; 

int main() 
{ 
    //contents 
    std::stringstream s(
      "a = 1\n" 
      "b = 2\n" 
      "c = test option\n"); 
    //parameters 
    std::set<std::string> options; 
    options.insert("a"); 
    options.insert("b"); 
    options.insert("c"); 

    //parser 
    for (pod::config_file_iterator i(s, options), e ; i != e; ++i) 
    { 
     std::cout << i->value[0] << std::endl; 
    } 
} 

pienso que las cosas va bien, pero en realidad hay algunos errores :

/tmp/ccNQEbJM.o: En función boost::program_options::detail::basic_config_file_iterator<char>::basic_config_file_iterator(std::basic_istream<char, std::char_traits<char> >&, std::set<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<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)': a.cpp:(.text._ZN5boost15program_options6detail26basic_config_file_iteratorIcEC1ERSiRKSt3setISsSt4lessISsESaISsEEb[boost::program_options::detail::basic_config_file_iterator<char>::basic_config_file_iterator(std::basic_istream<char, std::char_traits<char> >&, std::set<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<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)]+0x24): undefined reference to impulso :: :: program_options detalle :: :: common_config_file_iterator common_config_file_iterator (std :: set, std :: asignador>, std :: menos, std :: asignador> >, std :: asignador, std :: asignador>>> const &, bool)' a.cpp :(. text._ZN5boost15program_options6detail26basic_config_file_iteratorIcEC1ERSiRKSt3setISsSt4lessISsESaISsEEb [boost :: :: program_options detalle :: :: basic_config_file_iterator basic_config_file_iterator (std :: basic_istream> &, std :: set, std :: allocator>, std :: less, std :: allocator>>, std :: allocator, std :: allocator>>> const &, bool)] + 0x5f): referencia no definida a boost::program_options::detail::common_config_file_iterator::get()' /tmp/ccNQEbJM.o: In function boost :: eof_iterator> :: increment() ': a.cpp :(. Text._ZN5boost12eof _iteratorINS_15program_options6detail27common_config_file_iteratorENS1_12basic_optionIcEEE9incrementEv [eof_iterator impulso ::> :: incremento()] + 0x10): referencia indefinida a boost::program_options::detail::common_config_file_iterator::get()' /tmp/ccNQEbJM.o: In function impulso :: :: program_options detalle :: basic_config_file_iterator :: getline (std :: basic string, std :: asignador> &) ': a.cpp :(. text._ZN5boost15program_options6detail26basic_config_file_iteratorIcE7getlineERSs [boost :: program_options :: detail :: basic_config_file_iterator :: getline (std :: basic_string, std :: allocator> &)] + 0x5b): referencia no definida a `boost :: program_options: : to_internal (std :: basic_string, std :: asignador> const &)' collect2: ld devolvió el código de salida 1

no puedo averiguar dónde y por qué salió mal.

+2

Nunca vinculados a las bibliotecas de impulso. Necesita especificar las opciones apropiadas '-l'. –

+0

por cómo? Instalo boost por sudo apt-get install libboost-dev. No entiendo dónde están las bibliotecas. Especifico por "g ++ test.cpp -lboost-program_options" pero no puedo cargar lboost-program_options. – light13

+0

Todo es guión bajo, tiene un '-' después del impulso que debería ser '_' – fefe

Respuesta

15

Necesitas enlace a la biblioteca program_options impulso, ya que no todo en la Boost es plantillas puros:

[email protected]:/tmp$ cat bpoex.cpp 
#include <iostream> 
#include <string> 
#include <set> 
#include <sstream> 

#include <boost/config.hpp> 
#include <boost/program_options/detail/config_file.hpp> 
#include <boost/program_options/parsers.hpp> 

namespace pod = boost::program_options::detail; 

int main() 
{ 
    //contents 
    std::stringstream s(
      "a = 1\n" 
      "b = 2\n" 
      "c = test option\n"); 
    //parameters 
    std::set<std::string> options; 
    options.insert("a"); 
    options.insert("b"); 
    options.insert("c"); 

    //parser 
    for (pod::config_file_iterator i(s, options), e ; i != e; ++i) 
    { 
     std::cout << i->value[0] << std::endl; 
    } 
} 
[email protected]:/tmp$ g++ -o bpoex bpoex.cpp -lboost_program_options 
[email protected]:/tmp$ ./bpoex 
1 
2 
test option 
[email protected]:/tmp$ 
+0

/usr/bin/ld: no se puede encontrar -lboost_program_options collect2: ld devuelto 1 estado de salida ¿por qué no puedo vincular boost_program_options? – light13

+4

Sé dónde extrañé. Es embarazoso que "sudo apt-get install libboost-dev" no instale las opciones del programa de la biblioteca. Necesito instalarlo por "sudo apt-get libboost-program-options-dev". Después de eso, puedo usar "g ++ test.cpp -lboost_program_options" para compilar como lo que acaba de hacer. Gracias Dirk, David, fefe. – light13

+4

"sudo apt-get install libboost-all-dev" instalará todas las bibliotecas de impulso. – dimitri

Cuestiones relacionadas