2010-07-28 19 views
15

Estoy tratando de compilar el multiple_sources.cpp para compilar en mi computadora. Estoy ejecutando Xubuntu Lucid Lynx completamente actualizado.No se puede encontrar la biblioteca C++ al vincular, error al compilar el ejemplo `boost :: program_options`

se compilará sin problema con g++ -c multiple_sources.cpp pero cuando intento de vincular y hacer una exectuable con g++ multiple_sources.o me sale:

multiple_sources.cpp:(.text+0x3d): undefined reference to `boost::program_options::options_description::m_default_line_length' 
multiple_sources.cpp:(.text+0x87): undefined reference to `boost::program_options::options_description::options_description(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int)' 
multiple_sources.cpp:(.text+0x15a): undefined reference to `boost::program_options::options_description::add_options()' 
multiple_sources.cpp:(.text+0x17b): undefined reference to `boost::program_options::options_description_easy_init::operator()(char const*, char const*)' 
multiple_sources.cpp:(.text+0x193): undefined reference to `boost::program_options::options_description_easy_init::operator()(char const*, char const*)' 
multiple_sources.cpp:(.text+0x1af): undefined reference to `boost::program_options::options_description_easy_init::operator()(char const*, boost::program_options::value_semantic const*, char const*)' 
multiple_sources.cpp:(.text+0x1eb): undefined reference to `boost::program_options::options_description::m_default_line_length' 
multiple_sources.cpp:(.text+0x252): undefined reference to `boost::program_options::options_description::options_description(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int)' 
... 

etcétera hasta la saciedad.

sí tengo la biblioteca instalada:

>ls -l /usr/lib/libboost_program_options* 
-rw-r--r-- 1 root root 640800 2010-03-31 21:19 /usr/lib/libboost_program_options.a 
lrwxrwxrwx 1 root root  26 2010-04-09 00:57 /usr/lib/libboost_program_options-mt.a  -> libboost_program_options.a 
lrwxrwxrwx 1 root root  34 2010-04-09 00:57 /usr/lib/libboost_program_options-mt.so -> libboost_program_options.so.1.40.0 
lrwxrwxrwx 1 root root  34 2010-04-09 00:57 /usr/lib/libboost_program_options.so -> libboost_program_options.so.1.40.0 
-rw-r--r-- 1 root root 289336 2010-03-31 21:19 /usr/lib/libboost_program_options.so.1.40.0 

Después de leer la página g ++ hombre, también he intentado:

  • g++ -llibboost_program_options multiple_sources.cpp
  • g++ -llibboost_program_options.a multiple_sources.cpp
  • g++ -llibboost_program_options.so multiple_sources.cpp
  • y todos de los anteriores con -L/usr/lib antes de la -l

Todos ellos fallan con una variación de:

/usr/bin/ld: cannot find -llibboost_program_options.so 
collect2: ld returned 1 exit status 

¿Qué estoy haciendo mal?

Respuesta

24

El parámetro -l es incorrecto; Deshágase de la preinstalación lib y use -lboost_program_options.

El vinculador espera que todas las bibliotecas comiencen con lib, y que usted lo deje desactivado al especificar la biblioteca.

También puede incluir la ruta completa a la biblioteca en la lista de archivos, sin -l (por ejemplo, g++ multiple_sources.cpp /usr/lib/libboost_program_options.so), pero para las bibliotecas del sistema, es mejor seguir la convención; no siempre se instalan en /usr/lib.

+2

Correcto. Confusamente, el vinculador espera que todas las bibliotecas comiencen con 'lib', y que usted lo deje desactivado al especificar la biblioteca. –

+0

@Mike ¡Gracias! Estaba a punto de preguntar por qué fue eso. Ahora es esto requerido? ¿Hay alguna manera de anular eso? Pregunto por curiosidad ahora. – ArtB

+1

@ArtB: creo que también podría incluir la ruta completa a la biblioteca en la lista de archivos, sin '-l' (por ejemplo,' g ++ multiple_sources.cpp/usr/lib/libboost_program_options.so'). Pero para las bibliotecas de sistemas, es mejor seguir las convenciones; no siempre están instalados en '/ usr/lib'. –

Cuestiones relacionadas