web-dev-qa-db-ja.com

リンク時に静的ライブラリと共有オブジェクトライブラリを混在させることはできますか?

10個の実行可能ファイルを生成するCプロジェクトがあり、そのすべてを静的にリンクします。私が直面している問題は、これらの実行可能ファイルの1つが、共有オブジェクトバージョンのみが利用可能なサードパーティライブラリを使用していることです。

-staticフラグをgccに渡すと、ldは問題のライブラリが見つからないというエラーを表示し(.aバージョンを探していると思われます)、実行可能ファイルはビルドされません。理想的には、静的ライブラリが見つからない場合は、できる限り静的にリンクし、共有オブジェクトライブラリにフェールオーバーするように「ld」に指示できるようにします。

Interiumでは、「ld」がlib1とlib2で静的にリンクすることを期待してgcc -static -lib1 -lib2 -shared -lib3rdparty foo.c -o foo.exeのようなものを試しましたが、実行時の依存関係はlib3rdpartyにのみあります。残念ながら、これは意図したとおりには機能しませんでした。代わりに-sharedフラグが-staticフラグを上書きし、すべてが共有オブジェクトとしてコンパイルされました。

静的にすべてか無かの取引をリンクしていますか、それとも私がミックスアンドマッチできる方法がありますか?

51
SiegeX

このスレッド を見ると、実行できることがわかります。 GNU提案の人

gcc foo.c -Wl,-Bstatic -lbar -lbaz -lqux -Wl,-Bdynamic -lcorge -o foo.exe
63
Anthony