#c #boost #linker-errors #ubuntu-10.04 #undefined-reference
#c #boost #компоновщик -ошибки #ubuntu-10.04 #неопределенная ссылка
Вопрос:
Я использую ubuntu 10.04 и libboost1.40.
ls -l /usr/lib | grep boost_pro
-rw-r--r-- 1 root root 640800 2010-04-01 05:19 libboost_program_options.a
lrwxrwxrwx 1 root root 26 2011-11-03 22:40 libboost_program_options-mt.a -> libboost_program_options.a
lrwxrwxrwx 1 root root 34 2011-11-03 22:40 libboost_program_options-mt.so -> libboost_program_options.so.1.40.0
lrwxrwxrwx 1 root root 34 2011-11-03 22:40 libboost_program_options.so -> libboost_program_options.so.1.40.0
-rw-r--r-- 1 root root 289336 2010-04-01 05:19 libboost_program_options.so.1.40.0
это main.cpp (только для тестирования)
#include <string>
#include <iostream>
#include <boost/date_time/gregorian/gregorian.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/program_options/options_description.hpp>
//---------------------------------------------------------------------
int main(int argc,char** argv)
{
boost::gregorian::date now(boost::gregorian::day_clock::local_day());
//is works fine
std::cout<<boost::gregorian::to_iso_string(now)<<std::endl;
boost::program_options::options_description a; //but here i get an error when the constructor have started
return 0;
}
g -o main -lboost_date_time -lboost_program_options main.cpp amp;amp; ./main
/tmp/cc3RJHsG.o: In function `main':
main.cpp:(.text 0x81): undefined reference to `boost::program_options::options_description::options_description(unsigned int, unsigned int)'
collect2: ld returned 1 exit status
я делаю
find /usr/include/ -name "*description*"
/usr/include/boost/program_options/options_description.hpp
и есть только прототип couse.
Есть идеи?
Ответ №1:
По-видимому, существует прототип конструктора с двумя аргументами, который принимает два unsigned int
s, оба со значением по умолчанию. Следовательно, это становится конструктором по умолчанию, который используется при a
создании. Это этот конструктор:
options_description(unsigned = m_default_line_length,
unsigned = m_default_line_length/2);
Однако это было добавлено в Boost 1.42 и не существует в вашей версии 1.40.
Итак, я думаю, вам каким-то образом удалось перезаписать заголовки, которые Ubuntu установил для вас, на более свежую версию, но не обновил библиотеки /usr/lib
. Попробуйте удалить и переустановить пакет.
Если вам нужен более новый Boost, чем 1.40, либо обновите Ubuntu, либо удалите все пакеты, связанные с Boost, и переустановите из исходного /usr/local
кода. Менеджер пакетов будет держаться подальше от всего, что входит /usr/local
, так что это гарантирует, что такого рода проблемы не повторятся.