我想使用(在Linux Debian Squeeze g ++ 4.4中)单独编译的Boost(1.54.0)库:
为了做到这一点,根据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库?
答案 0 :(得分:2)
无法给出确切的答案,因为我不知道哪个boost
lib取决于哪个,但这就是事情:使用默认的Linux链接器(不知道它叫什么,ld?)你必须非常小心将libs提供给链接器的顺序(-l
标志的顺序)。您必须首先指定依赖库,然后依次指定依赖库。因此,如果您的应用使用库a
而a
取决于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。