【问题标题】:C++ / Boost: Undefined Symbols in example?C ++ / Boost:示例中的未定义符号?
【发布时间】:2011-04-28 14:33:19
【问题描述】:

我试图编译的例子来自:http://www.boost.org/doc/libs/1_46_1/doc/html/boost_asio/examples.html (聊天示例)

这是我用来制作它的:

>>>    g++ chat_client.cpp chat_message.hpp
>>>    g++ chat_server.cpp chat_message.hpp

这是终端输出的内容:

% g++ chat_client.cpp chat_message.hpp
In file included from chat_client.cpp:17:
chat_message.hpp: In member function ‘void chat_message::encode_header()’:
chat_message.hpp:84: warning: format ‘%4d’ expects type ‘int’, but argument 3 has type ‘size_t’
ld: warning: in chat_message.hpp, file was built for unsupported file format which is not the architecture being linked (x86_64)
Undefined symbols:
  "boost::system::generic_category()", referenced from:
      __static_initialization_and_destruction_0(int, int)in cctJA2c1.o
      __static_initialization_and_destruction_0(int, int)in cctJA2c1.o
  "boost::thread::start_thread()", referenced from:
      boost::thread::thread<boost::_bi::bind_t<unsigned long, boost::_mfi::mf0<unsigned long, boost::asio::io_service>, boost::_bi::list1<boost::_bi::value<boost::asio::io_service*> > > >(boost::_bi::bind_t<unsigned long, boost::_mfi::mf0<unsigned long, boost::asio::io_service>, boost::_bi::list1<boost::_bi::value<boost::asio::io_service*> > >, boost::disable_if<boost::is_convertible<boost::_bi::bind_t<unsigned long, boost::_mfi::mf0<unsigned long, boost::asio::io_service>, boost::_bi::list1<boost::_bi::value<boost::asio::io_service*> > >&, boost::detail::thread_move_t<boost::_bi::bind_t<unsigned long, boost::_mfi::mf0<unsigned long, boost::asio::io_service>, boost::_bi::list1<boost::_bi::value<boost::asio::io_service*> > > > >, boost::thread::dummy*>::type)in cctJA2c1.o
  "boost::thread::join()", referenced from:
      _main in cctJA2c1.o
  "typeinfo for boost::detail::thread_data_base", referenced from:
      typeinfo for boost::detail::thread_data<boost::_bi::bind_t<unsigned long, boost::_mfi::mf0<unsigned long, boost::asio::io_service>, boost::_bi::list1<boost::_bi::value<boost::asio::io_service*> > > >in cctJA2c1.o
  "vtable for boost::detail::thread_data_base", referenced from:
      boost::detail::thread_data_base::thread_data_base()in cctJA2c1.o
  "boost::thread::~thread()", referenced from:
      _main in cctJA2c1.o
      _main in cctJA2c1.o
  "boost::detail::thread_data_base::~thread_data_base()", referenced from:
      boost::detail::thread_data<boost::_bi::bind_t<unsigned long, boost::_mfi::mf0<unsigned long, boost::asio::io_service>, boost::_bi::list1<boost::_bi::value<boost::asio::io_service*> > > >::~thread_data()in cctJA2c1.o
      boost::detail::thread_data<boost::_bi::bind_t<unsigned long, boost::_mfi::mf0<unsigned long, boost::asio::io_service>, boost::_bi::list1<boost::_bi::value<boost::asio::io_service*> > > >::~thread_data()in cctJA2c1.o
  "boost::system::system_category()", referenced from:
      boost::system::get_system_category()     in cctJA2c1.o
      boost::system::error_code::error_code()in cctJA2c1.o
      __static_initialization_and_destruction_0(int, int)in cctJA2c1.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
  • Boost 安装正确。我有另一个应用程序使用了一些提升位功能。

更新: 这是我正在使用的当前命令:

% g++ chat_client.cpp chat_message.hpp -lboost_asio -lboost_thread -o client -L/opt/local/lib/

说找不到 -lboost_asio

我查看了 opt/local/lib(安装了 boost),但没有看到任何 libboost_asio.so 或类似的东西 =\

【问题讨论】:

    标签: c++ networking boost


    【解决方案1】:

    您需要提供 g++ boost 库来链接 usins -l 选项。我快速浏览了这个示例并猜测您肯定需要thread 库。您可以使用它链接

    g++ source.cpp -o executable -lboost_thread 
    

    您可能还需要使用 boost_system 库

    g++ source.cpp -o executable -lboost_thread -lboost_system
    

    【讨论】:

    • 添加 -lboost 不起作用...说找不到库。我使用终端的包管理器安装了 boost...所以...我知道我拥有它。 + 我的其他应用程序可以使用它...虽然我们也不使用 -lboost...
    • 在 -l 选项中,您不仅应该指定 boost,还应该指定所使用的 boost 库的名称。例如,当您的应用程序使用 boost-thread 库(带有 soname libboost_thread.so 的库)时,您应该指定 -lboost_thread
    • 添加了更新。我真的不确定我需要什么库。我希望这被记录在某个地方
    • 找到了答案,我需要 -mt 在 boost_thread 的末尾。感谢您的帮助! stackoverflow.com/questions/2568243/…
    • 我在几分钟前更正了我的答案。 Boost asio 是仅标头库,它没有相应的共享库可链接。对不起,我一开始忽略了这一点。只需从命令行中删除 -lboost_asio。
    猜你喜欢
    • 2015-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多