2010-07-28 5 views
15

Я пытаюсь скомпилировать multiple_sources.cpp для компиляции на моем компьютере. Я полностью обновил Xubuntu Lucid Lynx.Не удается найти библиотеку C++ при связывании, исправление ошибок в примере `boost :: program_options`

Это будет компилировать без проблем с g++ -c multiple_sources.cpp, но когда я пытаюсь связать и сделать exectuable с g++ multiple_sources.o я получаю:

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

и так далее объявления до тошноты.

у меня установлена ​​библиотека:

>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 

После прочтения человек страницы г ++, я также пытался:

  • g++ -llibboost_program_options multiple_sources.cpp
  • g++ -llibboost_program_options.a multiple_sources.cpp
  • g++ -llibboost_program_options.so multiple_sources.cpp
  • и все выше, с -L/usr/libперед тем-l

Все они будут выпадать с изменением на:

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

Что я делаю не так?

ответ

24

Неверный параметр -l; избавиться от предварительной установки lib и использовать -lboost_program_options.

Компонент ожидает, что все библиотеки начнутся с lib, и вам следует оставить это при указании библиотеки.

Вы также можете указать полный путь к библиотеке в списке файлов, без -l (например, g++ multiple_sources.cpp /usr/lib/libboost_program_options.so), но для системных библиотек лучше следовать стандарту; они не всегда устанавливаются в /usr/lib.

+2

Правильно. Смутно, компоновщик ожидает, что все библиотеки начнут с 'lib', и для вас это нужно оставить при указании библиотеки. –

+0

@Mike Спасибо! Я как раз собирался спросить, почему это так. Теперь это требуется? Есть ли способ переопределить это? Теперь я спрашиваю из любопытства. – ArtB

+1

@ArtB: Я думаю, вы также можете включить полный путь к библиотеке в список файлов без '-l' (например,' g ++ multiple_sources.cpp/usr/lib/libboost_program_options.so'). Но для системных библиотек лучше следовать соглашению; они не всегда устанавливаются в '/ usr/lib'. –