1

やあみんな、これは初歩的な質問かもしれませんが、Googleで役立つ解決策が本当に見つかりません. 私は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__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' 内


私が使用したマシンは、MIPS64 命令セット プロセッサを使用する SiCortex SC5832 で、OS は 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 を挿入し、パッチを提出してブーストすることもできます。

また、回避策の 1 つはBOOST_AC_USE_PTHREADSを定義することであることがわかります。これはアトミック カウントの周囲でミューテックスを使用しますが、これはおそらく効率が大幅に低下しますが、少なくとも、MIPS64 でサポートされているアトミック操作を理解できるまでは機能します。

于 2011-04-04T01:27:48.457 に答える