2010-07-28 2 views
15

Sto cercando di compilare lo multiple_sources.cpp per compilare il mio computer. Sto eseguendo Xubuntu Lucid Lynx completamente aggiornato.Impossibile trovare la libreria C++ durante il collegamento, errore durante la compilazione dell'esempio `boost :: program_options`

Sarà compilare senza problema con g++ -c multiple_sources.cpp ma quando provo a collegare e fare un exectuable con g++ multiple_sources.o ottengo:

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)' 
... 

eccetera fino alla nausea.

ho la Libreria installata:

>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 

Dopo aver letto la pagina man g ++, ho anche provato:

  • g++ -llibboost_program_options multiple_sources.cpp
  • g++ -llibboost_program_options.a multiple_sources.cpp
  • g++ -llibboost_program_options.so multiple_sources.cpp
  • e tutti di quanto sopra con -L/usr/libprima il -l

tutti falliscono con una variazione su:

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

Che cosa sto facendo di sbagliato?

risposta

24

Il parametro -l è errato; sbarazzarsi della pre-fix lib e utilizzare -lboost_program_options.

Il linker si aspetta che tutte le librerie inizino con lib e che si lascino spenti quando si specifica la libreria.

Si potrebbe includere anche il percorso completo per la libreria nella lista dei file, senza -l (ad esempio g++ multiple_sources.cpp /usr/lib/libboost_program_options.so), ma per le librerie di sistema, è meglio seguire convenzione; non sono sempre installati in /usr/lib.

+2

Proprio così. In modo confuso, il linker si aspetta che tutte le librerie inizino con 'lib', e che tu lo lasci fuori quando specifichi la libreria. –

+0

@Mike Grazie! Stavo per chiedere perché era così. Ora è necessario? C'è qualche modo di scavalcarlo? Chiedo per curiosità ora. – ArtB

+1

@ArtB: Penso che potresti anche includere il percorso completo della libreria nell'elenco di file, senza '-l' (ad esempio' g ++ multiple_sources.cpp/usr/lib/libboost_program_options.so'). Ma per le librerie di sistema è meglio seguire le convenzioni; non sono sempre installati in/usr/lib'. –