编译和使用Boost C++库的帮助

7

我正在开发一个C++项目,希望使用boost的序列化库。我从boost的主页下载并安装了最新的boost库。

当我尝试编译和运行boost的序列化示例之一时,出现了各种错误,看起来像这样:

    /usr/local/include/boost/archive/detail/iserializer.hpp:173: undefined reference to `boost::archive::archive_exception::~archive_exception()'
./demo.o: In function `void boost::archive::detail::save_non_pointer_type<boost::archive::text_oarchive>::save_standard::invoke<bus_schedule::trip_info>(boost::archive::text_oarchive&, bus_schedule::trip_info const&)':
/usr/local/include/boost/archive/detail/oserializer.hpp:253: undefined reference to `boost::archive::detail::basic_oarchive::save_object(void const*, boost::archive::detail::basic_oserializer const&)'
./demo.o: In function `void boost::archive::save_access::end_preamble<boost::archive::text_oarchive>(boost::archive::text_oarchive&)':
/usr/local/include/boost/archive/detail/oserializer.hpp:83: undefined reference to `boost::archive::detail::basic_oarchive::end_preamble()'
./demo.o: In function `void boost::archive::detail::load_pointer_type<boost::archive::text_iarchive>::invoke<bus_route*>(boost::archive::text_iarchive&, bus_route*&)':
/usr/local/include/boost/archive/detail/iserializer.hpp:518: undefined reference to `boost::archive::detail::basic_iarchive::load_pointer(void*&, boost::archive::detail::basic_pointer_iserializer const*, boost::archive::detail::basic_pointer_iserializer const* (*)(boost::serialization::extended_type_info const&))'
./demo.o: In function `void boost::archive::detail::save_pointer_type<boost::archive::text_oarchive>::non_polymorphic::save<bus_route>(boost::archive::text_oarchive&, bus_route&)':

我对C++和boost都是新手,希望得到一些帮助。

谢谢。


@user475505 链接错误。请检查是否已添加链接所需的库文件。 - yadab
3个回答

12

你可能需要链接序列化库。在/usr/lib中查找名称类似于libboost_serialization的内容。然后告诉g++(您没有说使用哪个编译器)要使用(链接到)此库:

g++ main.cpp -lboost_serialization

也就是说,如果库的名称是/usr/lib/libboost_serialization.a,则省略初始的lib和扩展名。

祝你好运!


感谢您的快速回复,我仍然有些困难,但我认为我至少正在正确的轨道上。我在原帖中忘记提到我正在使用Eclipse CDT进行开发。我认为你们两个都是对的,这是一个链接器问题,所以在进一步搜索后,我找到了一篇关于在eclipse中设置boost的文章,在链接器设置库字段下添加了boost_serialization。做完这些后,我仍然得到相同的错误。您还有什么建议可以帮助我在Eclipse中设置boost吗?谢谢 - Swaraj
尝试查看Eclipse传递给g++的命令行参数,然后确保链接部分是正确的(您可以尝试在Eclipse之外运行该命令)。如果无法解决问题,请在此处发布。 - Daniel Lidström
我仍然遇到问题,这是Eclipse正在使用的链接命令:“g++ -o“Testbench”./demo.o -lboost_serialization”,在Eclipse之外的命令行中也会出现相同的错误。感谢您迄今为止的帮助。 - Swaraj
g++ 是否能找到库?如果没有,那么您需要将目录添加到 libboost_serialization.a 中。类似这样:g++ -o Testbench demo.o -lboost_serialization -L/usr/lib - Daniel Lidström

5

感谢大家的帮助。虽然我的解决方案相当平淡无奇,可能并没有太多启发性,但我终于解决了问题。

我曾尝试手动安装boost库,直接从boost的官网下载,发现所有库都已经安装在/usr/local/lib和/usr/local/include/boost/中。但是,在反复遇到原始错误后,我决定看看Synaptic软件包管理器是否可以更好地安装boost库。我选择了“libboost1.40-all-dev”来安装所有内容,但仍然没有任何作用。

最后,我决定重新开始,手动删除了/usr/local/include中的boost/目录,并删除了/usr/local/lib中的所有libboost文件。我然后标记了所有boost库以完全删除所有内容。一旦卸载了所有boost库,我回到Synaptic软件包管理器,再次选择“libboost1.40-all-dev”。

我不确定在重新安装库时到底发生了什么变化,但一切又开始正常工作了。我首先从命令行测试,尝试使用以下命令再次编译boost网站上的demo.cpp:

g++ demo.cpp -lboost_serialization

并且它立即编译了。运行可执行文件显示了我所期望的结果。此外,我将文件移回到我的Eclipse项目中,将“boost_serialization”添加到链接器库中,并尝试构建该项目。一切都再次完美地工作,因为我可以构建该项目并运行示例代码。
我真的没有解释为什么这样可以解决我的问题,但对于任何遇到类似问题的人,我能给出的最好建议是不要直接安装boost库,而是让Synaptic Package Manager处理所有事情。
再次感谢大家,你们非常有帮助。

1

您需要链接到Boost.Serialization库。请参阅Boost的入门页面


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