2011-11-03 91 views
1

我使用ubuntu 10.04和libboost1.40。boost :: program_options undefined reference

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 && ./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 

而且也只是一个原型ofcouse。 任何想法?

回答

6

显然,有一个双参数构造函数的原型,它需要两个带有默认值的unsigned int。因此,这成为默认的构造函数,在创建a时使用。这是this constructor

options_description(unsigned = m_default_line_length, 
         unsigned = m_default_line_length/2); 

但是,这是在加速1.42和does not exist加入您的版本,1.40。

所以我觉得你设法覆盖了Ubuntu为你安装的头文件,有一个更新的版本,但没有更新/usr/lib中的库。尝试卸载并重新安装软件包。

如果你需要比1.40更新的加速,无论是升级你的Ubuntu,或卸载所有升压相关的软件包,并在/usr/local从源头重新安装。包管理器将远离/usr/local中的任何内容,所以这将确保这种麻烦不会再发生。

+0

非常感谢,现在它工作 –