繁体   English   中英

boost.asio链接和库

[英]boost.asio linking and libraries

我是boost.asio编程的新手,我很难连接boost库。

我的问题是,当包含asio标头时,如何找出应该链接到我的项目的库。

例如,我使用了#include <boost/date_time/posix_time/posix_time.hpp>#include <boost/asio.hpp指令。

所以这是我的命令来编译它:

g++ -I /usr/local/boost_1_55_0 ASIO.cpp -o HELLO -L /usr/local/lib/ -l boost_system

考虑我的boost库安装在/ usr / local / boost_1_55_0上,二进制文件在/ usr / local / lib上。

我的问题实际上是我在-l之后需要写的东西

谢谢你的回答。

需要链接的库将根据所使用的Boost.Asio功能和其他Boost头文件来确定。 通常,可以使用未定义引用的名称空间上的一些猜测来确定要链接到哪个库,并检查Boost库中的符号是否无效。


在下面的所有示例中,我都使用gcc 4.8.1。 确切的错误消息并不重要,因为它们的内容在编译器之间应该非常相似。

采取一个包含Boost.Asio的基本程序:

#include <boost/asio.hpp>

int main() {}

编译时:

$ g++ example.cpp -isystem /usr/local/boost_1_55_0
...
example.cpp:(.text+0x31): undefined reference to
    `boost::system::generic_category()'
...
/tmp/cc9ow7fd.o: In function `boost::asio::error::get_system_category()':
    example.cpp:(.text._ZN5boost4asio5error19get_system_categoryEv[
    _ZN5boost4asio5error19get_system_categoryEv]+0x5): undefined reference
     to `boost::system::system_category()'

注意,未定义的引用是boost::system命名空间中包含的符号。 如果要查看已安装的Boost库的列表,可能会想到libboost_system.so是链接的理想选择。 如果没有明显的候选对象,则可以使用nmreadelf之类的工具来检查候选库并查找符号:

$ nm --defined-only --print-file-name --demangle \
> /usr/local/lib/libboost_*.so | grep boost::system::generic_category
...
/usr/local/lib/libboost_system.so:
    00000000000015c0 T boost::system::generic_category()
...

在这种情况下, boost::system::generic_category()符号在libboost_system.so的文本部分中libboost_system.so 因此,基本程序需要链接到boost_system

g++ example.cpp -isystem /usr/local/boost_1_55_0 -L/usr/local/lib/ -lboost_system

这是一个更复杂的示例。 程序异步等待协程中的单调定时器,该协程由另一个线程执行。

#include <boost/asio.hpp>
#include <boost/asio/spawn.hpp>
#include <boost/asio/steady_timer.hpp>
#include <boost/thread/thread.hpp>

boost::asio::io_service io_service;

void handler(boost::asio::yield_context yield)
{
  boost::asio::steady_timer timer(io_service);
  timer.expires_from_now(boost::chrono::seconds(3));
  timer.async_wait(yield);
}

int main()
{
  boost::asio::spawn(io_service, &handler);
  boost::thread thread(boost::bind(
      &boost::asio::io_service::run, &io_service));
  thread.join();
}

尽管可以使用与以前相同的方法,但链接器错误会导致40多行错误的模板符号,这可能会让人望而生畏。 另一种方法是,可以编译该示例,但不能使用-c选项将其链接。 然后,可以检查生成的目标文件中是否存在未定义的符号:

$ g++ example.cpp -isystem /usr/local/boost_1_55_0 -c
$ nm --demangle --undefined example.o | grep boost
    U boost::coroutines::stack_traits::default_size()
    U boost::coroutines::stack_traits::is_unbounded()
    U boost::coroutines::stack_traits::maximum_size()
    U boost::coroutines::stack_traits::minimum_size()
    U boost::coroutines::detail::coroutine_context::jump(
        boost::coroutines::detail::coroutine_context&, long, bool)
    U boost::coroutines::detail::coroutine_context::coroutine_context(
        void (*)(long), boost::coroutines::stack_context const&)
    U boost::coroutines::detail::coroutine_context::coroutine_context()
    U boost::chrono::steady_clock::now()
    U boost::detail::thread_data_base::~thread_data_base()
    U boost::system::system_category()
    U boost::system::generic_category()
    U boost::thread::join_noexcept()
    U boost::thread::native_handle()
    U boost::thread::start_thread_noexcept()
    U boost::thread::detach()
    U typeinfo for boost::detail::thread_data_base
    U vtable for boost::detail::thread_data_base

该输出比链接器错误更易于管理。 再次,符号名称空间( boost::coroutineboost::chronoboost::threadboost::system )提供了一个很好的提示,说明哪些库可以定义该符号。 上述程序可以编译和链接:

g++ example.cpp -isystem /usr/local/boost_1_55_0 -L/usr/local/lib/ -lboost_coroutine -lboost_chrono -lboost_thread -lboost_system

另外,请注意链接顺序很重要

正如你在评论中所说,你在Ubuntu上,我会回答如何在Ubuntu系统上做到这一点。

首先,请确保您已安装该库。 使用apt将是最方便的,因为它省去了您手动将库放在/usr/local/lib

sudo apt-get install libboost-all-dev

然后,您可以使用以下命令编译文件:

g++ my_file.cpp -lboost_system

编辑:

我可以在你的命令中看到的唯一明显错误是你在标志指示符之后使用空格。 尝试这个:

g++ -I/usr/local/boost_1_55_0 ASIO.cpp -o HELLO -L/usr/local/lib/ -lboost_system

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM