たとえばphpのように外部モジュールでコンパイルできるアプリケーションを実行したいと思います。phpでは、実行時にモジュールをロードすることも、モジュールと一緒にphpをコンパイルすることもできるため、実行時にロードしなくてもモジュールを使用できます。しかし、私はこれがどのように行われるのか理解していません。module.cにモジュールがあり、say_helloという関数が1つある場合、意味を理解していれば、それをメインアプリケーションに登録するにはどうすればよいですか?
/* module.c */
#include <stdio.h>
// here register say_hello function, but how, if i can't in global scope
// call another function?
void say_hello()
{
printf("hello!");
}
すべてのファイル(メインアプリ+モジュール)を一緒にコンパイルすると、ユーザーがコードで呼び出した場合にのみ呼び出されるため、メインアプリからsay_hello関数への参照はありません。それで、どうすれば私のアプリに言うことができますか、ねえ、say_hello関数があります、誰かがそれを呼び出したい場合、あなたはそれが存在することを知っています。
編集1:実行時にテーブルのようなものが必要です。ここで、関数と呼ばれるユーザーが存在するかどうかを確認できます(Cと同等です)。ヘッダーファイルは役に立ちません。
EDIT2:私のアプリは私のスクリプト言語を解釈します。
EDIT3:誰かがphpで関数を呼び出す場合、phpinterpretはその関数が存在することを知っている必要があります。ダイナミックリンクについて知っています。.soまたは.dllがロードされると、いくつかの開始ルーチンが呼び出され、そのdllに関数を簡単に登録できるため、phpinterpretateは「say_hello」という関数などのモジュールが登録されているかどうかを確認できます。しかし、たとえばgdサポートを使用してphpをコンパイルしたい場合、gd関数をphp関数リストやハッシュテーブルなどにどのように登録しますか?