2

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

  • Boost.Chrono
  • Boost.Context
  • Boost.文件系统
  • Boost.GraphParallel
  • Boost.IOStreams
  • Boost.Locale
  • Boost.MPI
  • Boost.ProgramOptions
  • Boost.Python
  • 升压正则表达式
  • Boost.序列化
  • 升压信号
  • 升压系统
  • Boost.Thread
  • 升压定时器
  • 升压波

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

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

结果是两个文件夹includelib并在~/boost. 里面有~/boost/lib文件:

libboost_name.a
libboost_name.so
libboost_name.so.1.54.0

对于每个提升库。

然后我在我的 test.cpp 文件中包含一些库(例如正则表达式):

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

我告诉编译器在 ~/boost/lib 中搜索正则表达式库

$ 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 Installlibboost_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 库?

4

2 回答 2

2

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

-la -lb,

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

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

于 2013-09-14T13:14:47.607 回答
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$ 

这 直接从他们的网站使用Boost '信用卡' 示例文件。

于 2013-09-14T13:25:56.543 回答