5

次の問題があります。次のようないくつかのクラスを使用して、C ライブラリを初期化します。

class Hello
{
public:
  Hello()
  {
    cout << "Hello world" << endl;
  }

  ~Hello()
  {
    cout << "Goodbye cruel world" << endl;
  }

} hello_inst;

このコードを hello.cc ファイルに含めて、main() を含む別のファイルと一緒にコンパイルすると、main() の呼び出しの前に hello_inst が作成され、呼び出しの後に破棄されます。この場合、いくつかの行を出力するだけです。私のプロジェクトでは、LIBXML_TEST_VERSION を介して libxml を初期化します。

cmake プロジェクトで多くの同じコードを共有する複数の実行可能ファイルを作成しています。このスレッドによると: CMake で複数の実行可能ファイルを追加する上記のコードを含む静的ライブラリを作成し、そのライブラリに対して実行可能ファイルをリンクしました。残念ながら、その場合、hello_inst は作成されません (また、libxml2 は初期化されません)。この問題を解決するにはどうすればよいですか?

4

3 に答える 3

0

共有ライブラリのグローバル変数を強制的に標準で初期化する公式の方法はなく、コンパイラに依存します。

通常、これは、そのライブラリ内の何か (クラス、関数、または変数) が実際に初めて使用されるとき、または変数自体が実際に使用されるときに行われます。

強制的hello_instに使用する場合は、関数を呼び出してから、コンストラクターとデストラクターが呼び出されるかどうか、いつ呼び出されるかを確認します。

詳細については、このスレッドを参照してください: http://www.gamedev.net/topic/622861-how-to-force-global-variable-which-define-in-a-static-library-to-initialize/

于 2013-05-31T13:10:15.523 に答える