Unix/Linux 環境の動的リンクタイプ

Unix/Linux 環境の動的リンクタイプ

Windows静的ライブラリを作成するときは、リンカパスに含める必要がある.libファイルを作成するだけです。

Windows共有ライブラリを作成すると、.dllに加えて.libファイルも生成されます。このlibファイルには、ライブラリによって公開されたAPIの署名が含まれています。

このライブラリを使用する方法は2つあります。

  1. プロジェクトでライブラリAPIを直接参照し、リンカプロパティから.libファイルへのパスを追加できます。一部の人々はそれを静的リンク動的ライブラリと呼びます。
  2. あるいは、実行時に明示的に動的ライブラリをロードすることもできます。この場合、リンカの lib ファイルパスを指定する必要はありません。これを動的にリンクされた動的ライブラリと呼びます。

私の質問はLinuxの共有ライブラリに似ていますか?または、静的ライブラリ(.a)と共有ライブラリ(.so)のみを使用しますか?

gcc -lオプションを使用してLinuxに静的ライブラリを含める方法を知っています。動的ライブラリ(.so)を含めるために同じオプションを使用できますか?

ベストアンサー1

私は「静的にリンクされた動的ライブラリ」とは何かを理解しているとは言えず、ライブラリに含まれる署名について何も知らないとは言えません。 (興味深いのですが、リンカが引数の型の不一致を確認できることを意味していますか?接続リターンの種類)時間に? ELFには確かにそのような機能はありません。 )したがって、この答えは比較の観点からのものではありません。また、あなたの質問は非常に広いので、答えは表面的です。

はい、静的ライブラリ(.a)または共有ライブラリ(.so)を生成できます。リンカがリクエストを使用するライブラリを見つけるときなど、オプションで上書きされない-l限り、両方が存在する場合は共有ライブラリを優先します-static

ソースからライブラリをビルドするときは、静的ライブラリ(.a)または共有ライブラリ(.so)でビルドできます。両方ではありません。それにもかかわらず、ライブラリユーザーがリンクするバージョンを選択できるように、ビルドスクリプトが2つのバージョンをビルドするように設定されているパッケージがかなりあります(一度は場所に依存しないコードを使用し、一度は使用せずに2回コンパイルする必要があります)。 。

静的ライブラリの必要な部分は、ビルドされたバイナリに完全にマージされます。.a実行時にこのファイルを提供する必要はありません。代わりに、バイナリにリンクされている共有ライブラリは実行時に使用できる必要があります。ただし、ランタイムダイナミックリンカは通常、変更された名前「soname」(通常はlibsomething.soリンクタイムとlibsomething.so.<integer>ランタイムの両方)でそれを検索しますが、両方を許可する機能があります。わずかに異なるAPIを使用してシステムにインストールされた異なるバージョンのライブラリ。

あなたの質問から実行時に明示的に動的ライブラリをロードすると言われました。これは通常、モジュラーアプリケーションまたはプラグインを持つアプリケーションに対して行われます。この場合、関連ライブラリ(しばしば「モジュール」または「プラグイン」と呼ばれる)はアプリケーションにまったくリンクされておらず、ビルドタイムリンカーはこれについて何も知りません。代わりに、アプリケーション開発者は実行時の動的リンカーを呼び出し、ファイル名またはフルパス名でライブラリを開くように要求するコードを書く必要があります。場合によっては、オンにするモジュールの名前がアプリケーションの構成ファイルにリストされているか、どのモジュールが必要または必要でないかを決定する他のアプリケーションロジックがあります。

おすすめ記事