少なくとも Linux と Solaris では、静的ライブラリは実際にはコンパイル済みの .o を 1 つの大きなファイルにまとめたものにすぎません。スタティック ライブラリをコンパイルする場合、通常 -fpic フラグは省略されるため、生成されるコードは位置に依存します。
ここで、静的ライブラリが B であるとします。これをビルドして、結果の .a ファイルを作成しました。これは、位置に依存するすべての .o ファイルの単なるグロブです。今、ビルドしたい共有ライブラリ A があり、B を静的にリンクさせたいと考えています。A をビルドするときは、当然、-fpic フラグを使用して、生成されたコードの位置を独立させます。しかし、B に対してリンクすると、位置依存のオブジェクト ファイルと位置非依存のオブジェクト ファイルが混在していませんか?
-mimpure-text も指定しないと、テキストの再配置エラーが多く発生します。おそらくこれが原因だと思います。ライブラリをコンパイルするとき、共有バージョン、静的バージョン、共有ライブラリで使用できる静的バージョンの3回コンパイルする必要があるようです。私は正しいですか?-mimpure-text を使い続けることもできますが、g++ のマニュアル ページには、そうするとオブジェクトが実際に共有されないことが示されています (すべてが共有されていないのか、それとも静的にリンクされた部分だけなのかは不明ですが、誰か知っていますか?) .