0

PC から Ubuntu にコードを移植しようとしているところですが、Linux での開発経験が限られているため、いくつかの問題が発生しています。

CMake を使用して、すべてのビルドを生成します。Windows では VS2010 プロジェクトを作成し、Linux では Eclipse プロジェクトを作成しています。OpenCV のものをうまく移植できましたが、スレッド化されたブースト アプリを移植しようとして大きな頭痛の種になっています。

明確にするために、Ubuntu 12のクリーンインストールでこれまでに実行した手順を示します。(ライブラリのコックアップの可能性を修正するために、2回のクリーン再インストールを行いましたが、今はあきらめて質問しています):

  • パッケージ マネージャーを使用して Eclipse と Eclipse CDT をインストールする
  • パッケージ マネージャーを使用して CMake と CMake Gui をインストールする
  • パッケージマネージャーを使用して libboost-all-dev をインストールします

これまでのところ、私が行ったすべてです。エラーなしで CMake を使用して Eclipse プロジェクトを作成できるため、CMake はブースト インストールを正常に検出しています。私がEclipseを構築しようとすると、問題が発生します。私が構築しようとしているアプリは、一部の UDP I/O に boost::asio を使用し、boost::thread を使用して asio I/O サービスのワーカー スレッドを作成します。各モジュールを正常にコンパイルできますが、リンクしようとすると、次のようなエラーが表示されます。

/usr/bin/c++       CMakeFiles/RE05DevelopmentDemo.dir/main.cpp.o CMakeFiles/RE05DevelopmentDemo.dir/RE05FusionListener/RE05FusionListener.cpp.o CMakeFiles/RE05DevelopmentDemo.dir/NewEye/NewEye.cpp.o  -o RE05DevelopmentDemo -rdynamic -Wl,-Bstatic -lboost_system-mt -lboost_date_time-mt -lboost_regex-mt -lboost_thread-mt -Wl,-Bdynamic 
/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../lib/libboost_thread-mt.a(thread.o): In function `void boost::call_once<void (*)()>(boost::once_flag&, void (*)()) [clone .constprop.98]':
make[2]: Leaving directory `/home/david/Code/Build/Support/RE05DevDemo'
(.text+0xc8): undefined reference to `pthread_key_create'
/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../lib/libboost_thread-mt.a(thread.o): In function `boost::this_thread::interruption_enabled()':
(.text+0x540): undefined reference to `pthread_getspecific'
make[1]: Leaving directory `/home/david/Code/Build/Support/RE05DevDemo'
/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../lib/libboost_thread-mt.a(thread.o): In function `boost::this_thread::disable_interruption::disable_interruption()':
(.text+0x570): undefined reference to `pthread_getspecific'
/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../lib/libboost_thread-mt.a(thread.o): In   function `boost::this_thread::disable_interruption::disable_interruption()':
(.text+0x59f): undefined reference to `pthread_getspecific'

他の StackOverflow の投稿から収集し、既に確認したいくつかの落とし穴:

  • ブーストライブラリはすべて /usr/lib にあります
  • ブースト ヘッダーが見つからないというコンパイル エラーは発生していないため、見つかっているはずです。
  • 私は静的にリンクしようとしていますが、私の CMakeLists.txt が含まれているため、それを実現するにはEclipseが正しい引数を渡す必要があると思いますSET(Boost_USE_STATIC_LIBS ON)

私はここで正式にアイデアを出している.ブーストのローカルビルドや他の多くのものを試してみたが、これ以上成功しなかった. Ubuntu を再インストールして、libs ディレクトリや複数の奇妙なバージョンなどとのリンクを完全に破壊していないことを確認しました。どんな助けでも大歓迎です。

4

3 に答える 3

2

正しいメカニズムは Threads パッケージを使用することです:

find_package(Threads)
#...
target_link_libraries(my_app ${CMAKE_THREAD_LIBS_INIT} ...)

cmake と libpthreadも参照してください

于 2012-09-30T03:33:40.330 に答える
1

ターゲットをビルドするときに追加する-lpthreadと、コンパイルされます。

この他のスレッドを参照してください。

于 2012-09-26T05:35:19.530 に答える
0

わかりましたので、解決策を見つけました。

これは、リンク コマンドに -lpthread フラグがないことが原因でした。CMake を適切にリンクするには、TARGET_LINK_LIBRARIES 行を編集する必要があります。私の編集は次のとおりです。

オリジナル:

TARGET_LINK_LIBRARIES( RE05DevelopmentDemo ${Boost_LIBRARIES} )

変更され、機能しています:

IF(WIN32)
  TARGET_LINK_LIBRARIES( RE05DevelopmentDemo ${Boost_LIBRARIES} )
ELSE(WIN32)
  TARGET_LINK_LIBRARIES( RE05DevelopmentDemo ${Boost_LIBRARIES} pthread )
ENDIF(WIN32)

おそらく必要に応じELSE(WIN32)て をelseifに変更するか、CMakeコマンドFindThreadsを使用してpthreadにリンクする必要があると思いますが、現時点ではそれを行う方法がわかりません。負けました。興味深いことに、リンク コマンド-lpthreadの最後に 2 つのフラグが次々に追加されていることに気付きましたが、それでもすべてが問題なくコンパイルされています。

于 2012-09-26T06:27:46.337 に答える