私は、静的ライブラリ (.a & .lib) と動的ライブラリ (.so & .dll) の両方として利用可能にする必要がある再利用可能なライブラリのコレクションに取り組んでいます。
動的ライブラリの依存関係の管理をできるだけシンプルにしたい (必要な機能のビットごとに動的ライブラリを 1 つだけ使用する) ため、各動的ライブラリが持つすべての機能依存関係は、実際には動的ライブラリに静的にリンクされます。したがって、動的ライブラリはその機能をダウンストリーム クライアントに動的に提供しますが、アップストリームの依存関係は静的に満たされます。
これらすべての結果として、コードが共有ライブラリへのリンクに適しているように、すべての静的ライブラリを -fPIC でコンパイルする必要があります。同じことが、私たちが使用するサードパーティのライブラリにも当てはまります。-fPIC でコンパイルされたスタティック ライブラリである必要があります。
(ライブラリの PIC バリアントと非 PIC バリアントの両方をビルドできると思いますが、ターゲット プラットフォームごとにライブラリを3回コンパイルしたくありません。2 回で十分です!)。
だから、ここに私の問題があります:
-fPIC を使用して boost_system をスタティック ライブラリとしてコンパイルしようとしましたが、成功するかどうかわかりません。
/b2 --build-type=complete variant=release link=static threading=multi runtime-link=static --layout=versioned --cxxflags=-fPIC
このビルドでは、予想どおり、出力として .a ファイルが生成されます。ただし、boost スタティック ライブラリを共有ライブラリの 1 つにリンクしようとすると、boost_system が位置独立コードではないことを示すエラー メッセージが表示され始めます。
.../dependencies/external/boost/1_54_0/stage/lib/linux_x86_64/libboost_system-gcc46-s-1_54.a(error_code.o):
relocation R_X86_64_32 against `.rodata.str1.1' can not be used when making a shared object; recompile with -fPIC
ただし、-fPIC を使用してブーストを構築する (試みた) ことがあります。libboost_system が実際に PIC コードであるかどうかを判断するために使用できるテストはありますか? つまり、問題がブーストの構築にある場合、またはそれをアプリケーションにリンクする場合です。