1

私は、静的ライブラリ (.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 コードであるかどうかを判断するために使用できるテストはありますか? つまり、問題がブーストの構築にある場合、またはそれをアプリケーションにリンクする場合です。

4

1 に答える 1

2

C++ ランタイム ライブラリの静的リンクを有効にするコマンド ライン オプション「runtime-link=static」を削除することで、問題を解決できると思います。動的共有ライブラリ オブジェクトを構築しているため、特にクライアントが異なる Linux OS 構成からライブラリにリンクする場合は、この動作を回避する必要があります。ただし、オプション「link=static」は問題ないので、そのままにしておく必要があります。

于 2017-01-06T00:19:21.383 に答える