#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权限。
谢谢, 贝
答案 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支持哪些原子操作。