2016-10-03 5 views
0

Cプログラムにプラグインシステムをいくらか実装しようとしています。プラグインは共有ライブラリとしてコンパイルされ、コンパイル時にリンクされます。1つの名前を使用するグローバルリンク変数

のは、私が単独でリンクリスト構造体の定義があるとしましょう:

struct plugin_iface 
{ 
    int data, 
    struct plugin_iface* next 
}; 

各プラグインは、この構造体のグローバルインスタンスを作成し、それらのすべてのインスタンスが同じ名前持っている:私は同じように

struct plugin_iface IfaceList = 
{ 
    .data = 42, 
    .next = &IfaceList 
} // Defined in the global scope in each plugin 

を予想通り、nextはその親を指しています - このプラグインの内側です。そのようなスキームは、エラーなしにビルドおよびリンクすることに言及する価値があります。私はmain.c

extern struct plugin_iface IfaceList; 

を行う場合は、それが構築され、最新のをリンクされていたプラグインインスタンスに対応しています。

ここでは、すべての変数インスタンスにリンクリストを作成することをお勧めします。そのリストの各ノードは、1つのプラグインへのインタフェースを表します。それはCでも可能ですか?私は設定時のヘッダファイル生成を避けたい。

+0

コンパイル時にリンクされていますか?または実行時間ですか? –

+2

私は、Linuxがデバイスドライバを持っているのと同様の登録スキームを模倣します。プラグインはそれ自身の 'struct plugin_iface'を作成し、それを、おそらくはリンクされたリストを使って管理するいくつかのエンティティに渡します。そうすれば、プラグインはリンクされたリストの実装の詳細に煩わされることなく、単に 'register_plugin(&plugin_iface)'を実行することができます。 – Downvoter

+0

@Downvoterこのアプローチの問題は、プラグインのコードをレジスタ関数を呼び出すために実行する必要があることです。そして、各プラグインから単に関数を呼び出すことはできません。なぜなら、私たちが 'main'にいる間、その名前を知らないからです。 –

答えて

1

私はこの問題をリンカとC言語「暗黙的に」解決しないことを提案します。

代わりに、pluginsフォルダをディストリビューションに専用にし、実行時にそこに配置されている共有ライブラリを検出、ロード、および初期化します。

関連する問題