/ /動的ライブラリを静的ライブラリにリンクする(別名動的ライブラリを事前リンクする) - c、動的、静的、リンカ

動的ライブラリを静的ライブラリにリンクする(別名動的ライブラリを事前リンクする) - c、動的、静的、リンカ

私は非常に小さな図書館を持っています。静的ライブラリ(libx.a)に変換しますが、このライブラリは動的ライブラリ(liby.so)に依存します。私は静的ライブラリを "pre-link"して、libx.aに既にliby.soへの参照が含まれているようにしたいと考えています。

これは基本的に私が-lxが存在するプログラムをコンパイルするときはオプションです。これは、特に多くの共有ライブラリに依存している場合、libxとリンクするときの作業が簡単になります。

出来ますか ?はいの場合、どのように(gccと仮定して)?

それでも可能であれば、libxを使用しているプログラムがliby自体を使用している場合、何らかの面白い複製(想定している変数)がありますか?

回答:

回答№1は1

私は本当にあなたが静的ライブラリアーカイブへの共有ライブラリコード、またはスタティックライブラリをリンクするようにしたいかどうかは、自動的に共有ライブラリへの参照を作成します。

前者の場合、私はそれを行うツールがないことを知っていますが、それは解決可能な問題でなければなりません。あなたはおそらく、 .so 正常にファイルする .o ELF仕様を読んでいくうちに時間を費やして .o ファイルを .a アーカイブ。

後者の場合、ほとんどの人はこの問題を pkg-config。むしろGNU固有の別のアプローチは、生の代わりにGNUリンカースクリプトをインストールすることです .a リンカースクリプトが静的ライブラリーと必要な共用ライブラリーの両方を参照するようにしてください。


回答№2の場合は0

ここでの問題は、動的ライブラリがコンパイルされた位置独立型であり、ロード時に内部および外部参照を修正するための動的ローダーが必要です。したがって、動的ライブラリに対して明示的にリンクすることはできません。私が作業しているプロジェクトでは、通常、静的および動的バージョンのlibをコンパイルしています。これが理由の1つです。


回答№3の場合は0

この問題は、インテリジェントビルドシステムを使用することで解決できます。私は使用することをお勧めできます gyp。それはオプションがあります link_settings 静的ライブラリの場合:

{
"targets": [
{
"target_name": "x",  # will generate libx.a
"type": "static_library",
"sources": [],
"link_settings": {
"libraries": ["-ly"],
},
},
{
"target_name": "test",
"type": "executable",
"dependencies": ["x"],
"sources": [],
},
],
}