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

问题描述 投票:0回答:1

嘿伙计们, 这可能是一个菜鸟问题,但我真的无法通过谷歌找到任何有用的解决方案。 我正在用 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。海湾合作委员会4.2.3,Boost1.46.0。难道MIPS的兼容性有问题?我添加了 -mips64 选项,但它仍然给出相同的错误。 我知道这个环境不太常见,但我认为一些使用类似大机器的人可能会面临同样的问题。

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

谢谢, 托尼

c++ boost mips boost-asio mips64
1个回答
1
投票

此函数是 GCC 内置函数,在 GCC 4.2 (iirc) 左右引入 参见文档

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

如果你看

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 支持哪些原子操作之前它会起作用。

© www.soinside.com 2019 - 2024. All rights reserved.