2

私の用語が間違っている場合は、あらかじめお詫び申し上げます。

という共有ライブラリがあるとしましょうlibVectorMath.so。その中には、 と の 2 つの興味深い関数がaddVector()ありsubtractVector()ます。2 つの関数は でプロトタイプ化されていvectorMath.hます。testVectorMathまた、これら 2 つの関数を使用し、動的にリンクされている という実行可能ファイルもありますlibVectorMath.so

一般的に言えば、ビルドするtestVectorMathには、私もビルドする必要がありlibVectorMath.soます。どうしてこれなの?ヘッダー ファイルは、どのシンボルが で見つかると予想されるかvectorMath.hを伝えるのに十分ではありませんか?testVectorMathlibVectorMath.so

言い換えれば、 「呼び出されたライブラリを探してから、名前付きのシンボルとその中のシンボルを探すtestVectorMath」という指示を入れることはできませんか?libVectorMath.soaddVector()subtractVector()

4

1 に答える 1

1

このリンクを読んでください。それは非常に良い方法で同じことを伝えます!

上記の抜粋は次のとおりです。すべての共有ライブラリ スキームは、基本的に同じように機能します。リンク時に、リンカは通常どおりライブラリを検索して、未定義の外部シンボルを解決するモジュールを見つけます。ただし、モジュールの内容を出力ファイルにコピーするのではなく、リンカはモジュールの元のライブラリを記録し、ライブラリのリストを実行可能ファイルに入れます。プログラムがロードされると、スタートアップ コードはそれらのライブラリを見つけて、プログラムが開始する前にそれらをプログラムのアドレス空間にマップします (図 1. 標準のオペレーティング システム ファイル マッピング セマンティクスは、読み取り専用またはコピー オン ライトでマップされたページを自動的に共有します)。マッピングを行うスタートアップ コードは、オペレーティング システム、実行可能ファイル、プロセスのアドレス空間にマップされた特別なダイナミック リンカにある場合があります。

于 2016-07-05T09:07:51.503 に答える