2

コードの読み込み時にクラスを登録する必要があります。コードがアプリでコンパイルされている限り、うまく機能するソリューションを実装しました。

ただし、コードが静的ライブラリによって提供されている場合は、まったく機能しません。

私はこの答えと同様の方法でこの問題を解決しました:https ://stackoverflow.com/a/729028/171711 。

現在、私は次のようなものを持っています:

#define REGISTER(className)\
static const int __classDescriptor##className = MyRegister(#className, className::GetAllocator());

使用すると、次のようになります。

//Foo.cpp

REGISTER(Foo);

Foo::Foo()
{
  ...
}

そして、私はログにあります:

registered class:Foo

しかし、静的ライブラリを作成し、Fooがライブラリによって提供された場合、問題はREGISTER(Foo);呼び出されないことです。

スクリプトがこの動作に依存するネイティブC++クラスを使用できるようにするための複雑なロードシステムがあります。ライブラリがロードされたときにFoo.cppのコードを強制的に実行する方法はありますか?


編集:私の質問は、VisualStudioの静的リンクに関する質問に直接関連しているようです。自分のライブラリでも同じ問題があるようです。ライブラリのクラスのいくつかが登録されていることに気づきました。.hそして、彼らは私のプロジェクトに彼らのファイルが含まれているものだけです。

それで、ファイルにリンクせずにライブラリ内のコードを実行する方法はあり.hますか?

4

2 に答える 2

4

-all_loadリンカーオプションを使用して、静的ライブラリのすべてのメンバーをロードします。または、特定のライブラリについては、-force_loadpath_to_archiveを使用します。

Xcodeでは、実行可能ファイル(静的ライブラリではない)の[その他のリンカーフラグ]の下にこれらのオプションを追加する必要があります。

これにより、静的初期化関数の問題が修正されました。

于 2013-09-07T21:50:08.340 に答える
1

クラス記述子に依存する他のコードが呼び出される前にクラス記述子を初期化する唯一の方法は、ライブラリを初期化することです。

MyLibraryInit()それぞれに関数を呼び出して__classDescriptor##className、各記述子の初期化を強制する関数を追加しました。

残念ながら、それは私が見つけた中で最もエレガントなアプローチのようです。

于 2012-12-31T02:11:45.793 に答える