链接boost库的简单方法

时间:2013-09-14 08:37:07

标签: c++ boost

我想使用(在Linux Debian Squeeze g ++ 4.4中)单独编译的Boost(1.54.0)库:

  • Boost.Chrono
  • Boost.Context
  • Boost.Filesystem的
  • Boost.GraphParallel
  • 了Boost.Iostreams
  • Boost.Locale
  • Boost.MPI
  • Boost.ProgramOptions
  • Boost.Python的
  • Boost.Regex
  • Boost.Serialization
  • Boost.Signals
  • Boost.System
  • Boost.Thread
  • Boost.Timer
  • Boost.Wave

为了做到这一点,根据Easy Build and Install,我输入了终端

$ cd path/to/boost_1_54_0
$ ./bootstrap.sh --prefix=~/boost
$ ./b2 install

因此,在include中创建了两个文件夹lib~/boost。在~/boost/lib中有文件:

libboost_name.a
libboost_name.so
libboost_name.so.1.54.0

每个boost库。

然后我在test.cpp文件中包含了一些库(例如regex):

#include<boost/regex.hpp>   //may be also chrono, filesystem or whatever

我告诉编译器在〜/ boost / lib

中搜索regex库
$ g++ -I path/to/boost_1_54_0 test.cpp -o test -L~/boost/lib -lboost_regex

但是这会导致编译错误:

test.cpp:(.text+0x49): undefined reference to `boost::system::generic_category()'
test.cpp:(.text+0x53): undefined reference to `boost::system::generic_category()'
test.cpp:(.text+0x5d): undefined reference to `boost::system::system_category()'
collect2: ld returned 1 exit status

有什么问题?我的stage中没有~/boost个文件夹,Easy Build and Install中没有libboost_regex-gcc34-mt-d-1_36.a之类的内容。这是共鸣吗?

以下是test.cpp的内容

//I need a general solution/idea that works for any of these libraries
#include <boost/regex.hpp>
//#include <boost/chrono.hpp>
//#include <boost/filesystem.hpp>
//#include<boost/some-other-separately-compiled-library>

int main()
{
}

是否有一种简单的方法可以链接适用于所有必须单独构建的Boost库的boost库?

2 个答案:

答案 0 :(得分:2)

无法给出确切的答案,因为我不知道哪个boost lib取决于哪个,但这就是事情:使用默认的Linux链接器(不知道它叫什么,ld?)你必须非常小心将libs提供给链接器的顺序(-l标志的顺序)。您必须首先指定依赖库,然后依次指定依赖库。因此,如果您的应用使用库aa取决于b,则订单为:

-la -lb

不是相反。否则,当链接器遇到任何先前链接的代码尚未要求的新输入库时,它将优化来自这个新的“不必要的”库的符号。

底线 - 找出boost库之间依赖关系的顺序。

答案 1 :(得分:1)

Boost设置有些不对劲。 Boost中的任何特定库都应该根据需要正确解析。

在Debian / Ubuntu系统上,在标准位置使用标头和库并使用Boost,我可以使用单个g++调用-lfoo

edd@max:/tmp$ g++ -o boost_re_ex boost_regex_credit_card_ex.cpp -lboost_regex
edd@max:/tmp$ ./boost_re_ex 
validate_card_format("0000111122223333") returned 0
validate_card_format("0000 1111 2222 3333") returned 1
validate_card_format("0000-1111-2222-3333") returned 1
validate_card_format("000-1111-2222-3333") returned 0
machine_readable_card_number("0000111122223333") returned 0000111122223333
machine_readable_card_number("0000 1111 2222 3333") returned 0000111122223333
machine_readable_card_number("0000-1111-2222-3333") returned 0000111122223333
machine_readable_card_number("000-1111-2222-3333") returned 000111122223333
human_readable_card_number("0000111122223333") returned 0000-1111-2222-3333
human_readable_card_number("0000 1111 2222 3333") returned 0000-1111-2222-3333
human_readable_card_number("0000-1111-2222-3333") returned 0000-1111-2222-3333
human_readable_card_number("000-1111-2222-3333") returned 000-1111-2222-3333
edd@max:/tmp$ 

直接从他们的网站使用the Boost 'credit card' example file