動的ライブラリのヘッダーまたはプロトタイプ ファイルを実際に含める必要はありませんが、少なくとも によって返される値の特定の型情報を含める必要がありますdlsym
。
ダイナミック ライブラリのインクルード ファイルを含まない例については、こちらとこちらを参照してください。
あなたが投稿した例では、ヘッダーファイル/関数プロトタイプを持たないライブラリ関数から始めました。これは、C++ 名マングリングを回避する方法についての説明とともに、この場合にヘッダーファイルを含めた理由です。
ソース ファイルまたはヘッダー ファイルのいずれかで関数プロトタイプを使用せずに独自のライブラリを定義する場合は、使用時にヘッダー ファイルをインクルードする必要がありますdlsym
。それ以外の場合、動的ライブラリのヘッダー ファイルをインクルードする必要はありません。生成された共有オブジェクトにすでに含まれています。
ヘッダーファイルに含まれる関数プロトタイプは、実装された関数をリンカが名前で解決できるようにするためのものです。リンク方法に関係なく、共有オブジェクト ファイルには、リンカーがリンクするライブラリの実装が含まれます。
簡単に説明すると、に含まれるヘッダー ファイル#include
はプリプロセッサによって処理されます。つまり、リンカーに渡された結果のソース ファイル/ファイルは、各関数呼び出しが誰であるかを認識しています。 include ファイルであり、変更されたソースに含まれています。インクルード ファイルは、関数呼び出しが誰であるかをリンカに伝えます。
オブジェクト ファイル、共有オブジェクト ファイル、およびその他のライブラリ ファイルは、関数呼び出しプロトタイプの実装が何を行うかをリンカーに伝えます。
コメントで質問に答えるには、/etc/ld.so.conf へのlibdl.so
パスLD_LIBRARY_PATH
またはパスを追加して ldconfig を実行するだけで済みます。そのライブラリまたは関連するシンボリック リンク階層が、/usr/lib/
またはなどの標準的な場所にない場合/lib/
です。
詳細については、次の関連するStackOverflow の回答を参照してください。
詳細については、次の Web サイトを参照してください。