Boost.asio编译问题:对__sync_add_and_fetch_8的未定义引用

时间:2011-04-03 03:54:52

标签: boost compiler-construction boost-asio mips mips64

嘿伙计们, 这可能是一个菜鸟问题,但我真的找不到任何通过谷歌有用的解决方案。 我正在使用boost.asio测试一个hello world,该程序非常简单:

#include <iostream>
#include <boost/asio.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
int main()
{
    boost::asio::io_service io;
    boost::asio::deadline_timer t(io, boost::posix_time::seconds(5));
    t.wait();
    std::cout << "Hello, world!\n";
    return 0;
}

我通过了汇编并在我的 Intel Pentium PC(Ubuntu 10.10,gcc 4.4.5,Boost 1.46.0)上运行良好。我使用的命令行是

  

g ++ -o a a.cpp -I / Boost-Include-Path / -L / Boost-lib-Path / -lboost_system

但是当我在另一台机器上编译相同的代码(这是一个很大的代码,我稍后会解释它)时,它无法通过编译并出现这样的错误:


  

/tmp/ccOZxZBX.o:在函数boost::asio::detail::gcc_sync_fenced_block::gcc_sync_fenced_block()': a.cpp:(.text._ZN5boost4asio6detail21gcc_sync_fenced_blockC1Ev[boost::asio::detail::gcc_sync_fenced_block::gcc_sync_fenced_block()]+0x4c): undefined reference to __ sync_lock_test_and_set_4'/tmp/ccOZxZBX.o:函数boost::detail::atomic_count::operator++()': a.cpp:(.text._ZN5boost6detail12atomic_countppEv[boost::detail::atomic_count::operator++()]+0x30): undefined reference to __ sync_add_and_fetch_8'/tmp/ccOZxZBX.o:函数boost::detail::atomic_count::operator--()': a.cpp:(.text._ZN5boost6detail12atomic_countmmEv[boost::detail::atomic_count::operator--()]+0x30): undefined reference to __ sync_add_and_fetch_8 '/tmp/ccOZxZBX.o:在函数boost::detail::atomic_count::operator long() const': a.cpp:(.text._ZNK5boost6detail12atomic_countcvlEv[boost::detail::atomic_count::operator long() const]+0x30): undefined reference to __ sync_fetch_and_add_8'


我使用的机器是SiCortex SC5832,它使用MIPS64指令集处理器,操作系统改为CentoOS。 Gcc 4.2.3,Boost1.46.0。是否可能存在MIPS兼容性方面的问题?我添加了-mips64选项,但它仍然会给出相同的错误。 我知道这种环境不太常见,但我认为一些使用类似大机器的人可能会遇到同样的问题。

任何帮助将不胜感激。顺便说一句,我没有sudo权限。

谢谢, 贝

1 个答案:

答案 0 :(得分:1)

此函数是GCC内置函数,它是围绕GCC 4.2(iirc)see documentation引入的。

根据文档,它并非在所有目标处理器上都可用。

如果你看boost/smart_ptr/detail/atomic_count.hpp,它看起来会落入#elif defined(BOOST_SP_HAS_SYNC)区块。即boost/smart_ptr/detail/atomic_count_sync.hpp

boost/smart_ptr/detail/sp_has_sync.hpp中确定对此的支持。此标头基本上假定GCC在所有平台上都支持此功能,除了少数例外。您可能希望在此处插入MIPS作为另一个例外,并提交补丁以进行提升。

您还会看到一种解决方法是定义 BOOST_AC_USE_PTHREADS 。这将使用原子计数周围的互斥量,这可能效率明显降低,但至少它可以工作,直到你可以弄清楚MIPS64支持哪些原子操作。