2

Linux 共有ライブラリ ファイルに関する質問が 1 つだけあります。

Linux OS の動的共有ライブラリに関連する多くのリンクを見ました http://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html

上記のリンクに記載されています --- ライブラリのインクルード ファイル: ctest.h

LINUX では、ビルド関数 --- dlopen、dlsym、dlclose で libdl を使用します。
動的ライブラリのプロトタイプ ファイル ctest.h を含める必要は本当にあるのでしょうか。

上記の投稿に関連する提案をお願いします。

4

1 に答える 1

1

動的ライブラリのヘッダーまたはプロトタイプ ファイルを実際に含める必要はありませんが、少なくとも によって返される値の特定の型情報を含める必要がありますdlsym

ダイナミック ライブラリのインクルード ファイルを含まない例については、こちらこちらを参照してください。

あなたが投稿した例では、ヘッダーファイル/関数プロトタイプを持たないライブラリ関数から始めました。これは、C++ 名マングリングを回避する方法についての説明とともに、この場合にヘッダーファイルを含めた理由です。

ソース ファイルまたはヘッダー ファイルのいずれかで関数プロトタイプを使用せずに独自のライブラリを定義する場合は、使用時にヘッダー ファイルをインクルードする必要がありますdlsym。それ以外の場合、動的ライブラリのヘッダー ファイルをインクルードする必要はありません。生成された共有オブジェクトにすでに含まれています。

ヘッダーファイルに含まれる関数プロトタイプは、実装された関数をリンカが名前で解決できるようにするためのものです。リンク方法に関係なく、共有オブジェクト ファイルには、リンカーがリンクするライブラリの実装が含まれます。

簡単に説明すると、に含まれるヘッダー ファイル#includeはプリプロセッサによって処理されます。つまり、リンカーに渡された結果のソース ファイル/ファイルは、各関数呼び出しが誰であるかを認識しています。 include ファイルであり、変更されたソースに含まれています。インクルード ファイルは、関数呼び出しが誰であるかをリンカに伝えます。

オブジェクト ファイル、共有オブジェクト ファイル、およびその他のライブラリ ファイルは、関数呼び出しプロトタイプの実装が何を行うかをリンカーに伝えます。

コメントで質問に答えるには、/etc/ld.so.conf へのlibdl.soパスLD_LIBRARY_PATHまたはパスを追加して ldconfig を実行するだけで済みます。そのライブラリまたは関連するシンボリック リンク階層が、/usr/lib/またはなどの標準的な場所にない場合/lib/です。

詳細については、次の関連するStackOverflow の回答を参照してください。

詳細については、次の Web サイトを参照してください。

于 2012-12-02T18:16:41.097 に答える