2

私の質問は、ブーストがシステムではなくホームディレクトリにコンパイルされて保存されたときに、アーカイブを作成するときにブーストに静的にリンクする正しい方法は何だと思いますか? 私のプログラムをライブラリとして作成する背後にある考え方は、他の人が自分のプログラムでリンクできるように、ライブラリ ファイルを再配布できるようにすることです。

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 ライブラリに関する他のリンカ エラーが発生します。

4

1 に答える 1

1

アーカイブのアーカイブを作成していますが、リンカーがアーカイブを検索すると、オブジェクト ファイルが必要になります。リンカはlibppmi.a、オブジェクト以外のすべてのファイルを調べてスキップします。これらのファイルをlibboost_system.a処理する方法がわからないため、Boost シンボルが見つかりません。リンカーが処理するときに各ファイルの名前を出力する (を使用してリンクしている場合、またはリンカーにパススルーするために使用し-tている場合)とリンクすることで確認できます。ネストされたアーカイブを処理しないことがわかります。 .gccg++-Wl,-t-t

アーカイブにすべての Boost コードを含めたい場合は、個々のオブジェクトをリストする必要があります (Boost をビルドした場所でそれらを直接参照するか、Boost アーカイブからそれらを抽出して新しいアーカイブに追加します)。

これは正常に動作します。アーカイブを使用すると壊れます。

もちろん、リストしたファイルを含むアーカイブが作成されます。アーカイブを作成するには、個別のファイルを 1 つの大きなファイルに入れるだけで、そこに任意の種類のファイルを入れることができます。実際に問題が発生することはありませんが、それは結果が正しい、または使用可能であることを意味するものではありません。

また、boost ライブラリから .o ファイルを抽出しようとしましたが、pthread ライブラリに関する他のリンカ エラーが発生します。

それは正しいアプローチですが、別の問題に遭遇したので、アプローチをあきらめるのではなく、それを解決してください。Boost.Thread を使用している場合は、コンパイルしてリンクする必要があります-pthread

于 2013-03-10T22:43:41.137 に答える