私の質問は、ブーストがシステムではなくホームディレクトリにコンパイルされて保存されたときに、アーカイブを作成するときにブーストに静的にリンクする正しい方法は何だと思いますか? 私のプログラムをライブラリとして作成する背後にある考え方は、他の人が自分のプログラムでリンクできるように、ライブラリ ファイルを再配布できるようにすることです。
Linux でリンクできる C++ ライブラリ ファイルを作成したいと考えています。静的か動的かはあまり気にしませんが、静的の方が簡単かもしれません。
私が抱えている問題は、私が見つけた例では、ライブラリ内の他のライブラリをリンクする方法がわからないことです。私のライブラリは Boost を使用しており、Boost をビルドしましたが、ユーザー領域の外に移動する権限がありません。
次のような静的アーカイブを作成してみました。
cpp ファイルのコンパイル:
g++ -O3 -ffast-math -Wall -Wextra -g -I./ -I../../boost/ -c BuddyManager.cpp -o build/BuddyManager.o
静的アーカイブの作成:
ar rcs build/libpmi.a ../../boost/lib/libboost_system.a build/Application.o build/DataBlock.o (すべてのオブジェクト ファイルが後にリストされているなど)
しかし、後で作成した .a ファイルにリンクすると、未定義の参照エラーが発生します。
Mac で共有ライブラリ SO ファイルをビルドしてライブラリを作成できましたが、そのシステムでは Boost が標準のシステムの場所にインストールされていました。Linux で共有ライブラリをビルドすると、「/usr/lib/crtbegin.o の隠しシンボル `__dso_handle' が DSO によって参照されています」というエラーが表示され、Boost .SO ファイルが見つからないという問題がよくありました。したがって、静的リンクに変更することにしました。
システムは Scientific Linux SL リリース 5.3 (Boron) で実行されており、gcc-4.6.2 を使用しています。ただし、これをほとんどすべてのバージョンの GCC に移植できるようにしたいと考えています。
ありがとう。不明な点や詳細が必要な場合は、お問い合わせください。
欠落している参照の一部は次のとおりです。
「boost::thread::interrupt()」への未定義の参照
boost/boost/thread/pthread/thread_data.hpp:247: 「boost::this_thread::hiden::sleep_until(timespec const&)」への未定義の参照
boost/boost/archive/detail/iserializer.hpp:158: `boost::archive::detail::basic_serializer::~basic_serializer()' への未定義の参照
それらはすべてBoostにあるようです。Boost アーカイブにあるはずの参照が見つかりません。
詳細については、これは私がコンパイルしているものです:
ar rcs build/libppmi.a ../../boost/lib/libboost_system.a ../../boost/lib/libboost_iostreams.a ../../boost/lib/libboost_serialization.a ../. ./boost/lib/libboost_thread.a build/Application.o build/DataBlock.o build/Iteration.o build/Launcher.o build/Message.o build/Network.o build/Processes.o build/DataBlockManager.o build /Communicator.o ビルド/NetworkServer.o ビルド/NetworkClientSession.o ビルド/NetworkMessage.o ビルド/NetworkConnection.o ビルド/Threadable.o ビルド/BuddyManager.o
これは正常に動作します。アーカイブを使用すると壊れます。また、boost ライブラリから .o ファイルを抽出しようとしましたが、pthread ライブラリに関する他のリンカ エラーが発生します。