连接时找不到C++库,编译“boost::program_options”示例时出错。

20

我正在尝试在我的电脑上编译multiple_sources.cpp。我正在运行完全更新的Xubuntu Lucid Lynx操作系统。

使用g++ -c multiple_sources.cpp编译时没有问题,但是当我尝试链接并创建可执行文件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)'
...
< p >et cetera ad nauseum.

我已经安装了这个库:

>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++ 手册之后,我还尝试了以下方法:

  • 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 参数

但它们都失败了,出现了各种错误变化:

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

我做错了什么?

1个回答

28

-l参数有误,请去掉lib前缀,使用-lboost_program_options

链接器期望所有库以lib开头,并且您在指定库时应该省略它。

您也可以在文件列表中包含库的完整路径,而无需使用-l(例如g++ multiple_sources.cpp /usr/lib/libboost_program_options.so),但对于系统库,最好遵循惯例;它们并不总是安装在/usr/lib下。


2
没错。令人困惑的是,链接器希望所有库都以“lib”开头,并且您在指定库时要省略它。 - Mike Seymour
@Mike 谢谢!我正要问为什么。这是必须的吗?有没有办法可以重写它?现在我只是出于好奇而问。 - Sled
1
@ArtB: 我认为你也可以将库的完整路径包括在文件列表中,而不需要使用“-l”(例如“g++ multiple_sources.cpp /usr/lib/libboost_program_options.so”)。但对于系统库来说,最好遵循惯例;它们并不总是安装在“/usr/lib”中。 - Mike Seymour

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接