2011-12-23 19 views
11

私は共有ライブラリをC++で書いています。これは、不透明な型を作成、破棄、および操作するextern "C"関数で作成された可視インタフェースをエクスポートします。C++から呼び出された共有ライブラリ

今、このライブラリを使用する純粋なCプログラムを用意したいと思います。

私はこれを行うことができますか(プラットフォームは独立していますか)? mainがC++で書かれていないと、C++ランタイムとC++静的オブジェクトはいつ初期化されますか?

答えて

5

初期化フェーズはプラットフォームによって異なります。 Linuxの場合、動的にロードされるライブラリには、ライブラリがロードされるときに自動的にdlopen()によって呼び出される特別に宣言されたシンボルを含めることができます。

マンガのdlopen(3)のセクションを参照してください。旧式のシンボルinit()とfini()の詳細については、

スタティック・イニシャライザは暗黙的に__attribute__((constructor))とマークされています。したがって、共有ライブラリのロード時に呼び出すために特別な処理を行う必要はありません。私はこれが他のプラットフォームでも同じか類似していると思われます。

+0

補遺。 (glibc :) init/finiは実行時環境(crtS.o)によって提供され、__attribute __((コンストラクタ))とマークされた静的持続時間オブジェクトと呼び出し関数の初期化に使用されるため、init/finiを独自にオーバーライドすると問題これには、二重シンボルの定義による救済も含まれます。 –

+0

@jørgensen:それが非難される理由かもしれませんか? – onitake

4

私はこれを行うことができますか(プラットフォームは独立していますか)?

ライブラリの読み込みは、プラットフォームによって異なります。

メインがC++で記述されていない場合、C++ランタイムとC++静的オブジェクトはいつ初期化されますか ?

問題ではありません。メインが入力される前に初期化されます。

+1

まあ、 'main'が入った後でもライブラリを(手動で)読み込むことができます。そして、「彼らは本部が入る前に初期化されるだろう」と誤解している。実装定義では、静的オブジェクトの初期化が 'main'が入力される前に行われるのか、その最初の使用の前にいつ行われます。しかし、すべての実用的な目的のために、はい、 'main'の前、またはライブラリがロードされた直後に初期化されます。 – jweyrich

1

通常、共有ライブラリシステムには、mainではなく、この作業を実行するための独自のエントリポイントがありますが、DLLにはDLLMainというコードが記述されています。しかし、一般的なケースでは、それはあなたのビジネスのどれでもなく、この問題に対処するために使用したコンパイラの仕事です。

関連する問題