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 ディレクトリや複数の奇妙なバージョンなどとのリンクを完全に破壊していないことを確認しました。どんな助けでも大歓迎です。