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++ -oa 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函数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_add_and_fetch_8'


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

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

谢谢,托尼

4

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

于 2011-04-04T01:27:48.457 回答