2012-02-16 6 views
2

Objective-Cクラスを含むダイナミックライブラリを基本的にロードできるようにするコマンドライン実行可能ファイルがあります。プロジェクト設定では、自分のプログラムガベージコレクションをサポートしていないことを指定しました。この目的のために、NSBundleよりもグローバルに柔軟なライブラリをロードするために、ライブラリをロードするのにdlopenを使用します(最初にオフにし、最も重要なことはバンドルにないライブラリをロードすることができます)。しかしGCedライブラリを単にサポートしているプログラムから読み込むことは可能ですか?

、私はガベージコレクション、dlopenが失敗し、私はこのメッセージを取得する必要があり、ライブラリやフレームワークロードしよう:

開くことができません/パス/に/オブジェクト:のdlopen(/パスを/ to/lib、2):いいえ 適切なイメージが見つかりました。見つけました:
/パスを/に/ libに:私のプログラムは、ガベージコレクションをサポートしている場合、なぜそれが必要なライブラリをロードすることはできません

GC機能の不一致?どのようにそれを必要とするライブラリを読み込むことができますか?

にはガーベッジコレクションが必要なため、実際に実行可能ファイルにフラグを立てることはできません。ガベージコレクションをサポートしていないライブラリでは動作しなくなるためです。

私は実行可能ファイルのバージョンが2つありますが、それはサブパネルです。

その他の情報:私はマウンテンライオンのみを対象としています。私のプログラムはユニバーサルバイナリであり、現在はposix_spawn関数を使用して32ビットのカウンターパートとして再起動を処理しますが、ガベージコレクションを制御するフラグは存在しないようです。

答えて

0

私の解決策が見つかりました。 The Objective-C runtime has several switches triggered by environment variablesOBJC_DISABLE_GCなど)は、実行可能ファイルが必要な場合でもガベージコレクタを無効にすることができます。 This switch is taken into account when new images are loadedgc_enforcerを参照し、静的変数UseGCの使用方法)、GCをオフにすると、ライブラリがプロセスにロードされる方法に実際に影響します。

私の解決方法は、適切な保持/解放ロジックを実行可能ファイルに実装することですが、-fobjc-gc-onlyでコンパイルしてください。私はその後、ライブラリを正常にロードしようとします。それが動作すれば、すべてが良いです。そうでなければ、プログラムで同じ引数を持つプログラムを再起動し、その環境にOBJC_DISABLE_GC=YESを追加するので、GCは無効になり、ライブラリは今回は正常に読み込まれます。

このスニペットでは、エラー処理が除外されています。

char disableGC[] = "OBJC_DISABLE_GC=YES"; 
// resets the current process with the given argv and enables the GC as per useGC 
void respawn(char* const argv[], bool useGC) 
{ 
    posix_spawnattr_t attributes; 
    posix_spawnattr_init(&attributes); 
    posix_spawnattr_setflags(&attributes, POSIX_SPAWN_SETEXEC) 

    // build the environment variables array 
    std::vector<char*> environment; 
    for (char** environ_iter = environ; *environ_iter != 0; environ_iter++) 
     environment.push_back(*environ_iter); 

    // disable the GC if we need it off 
    if (!useGC) 
    { 
     environment.push_back(disableGC); 
    } 

    environment.push_back(nullptr); 

    pid_t child; 
    posix_spawn(&child, argv[0], nullptr, &attributes, argv, environment.data()); 
} 
+0

xcodeをこのコードで更新する方法を教えてください。このコードはどこに追加すればよいですか?ありがとう。 – revolutionkpi

0

ガーベッジ・コレクティブ・ライブラリーをロードするには、実行可能ファイルがガーベジ・コレクトされた環境で実行されている必要があります。あなたはどちらかに必要があります

  • は常にライブラリをロード再試行し、ライブラリはGCが必要であることを検出し、GCを使用して再起動GC
  • で実行されます。システム環境設定が32ビットペインのためにどのように再起動するかのようなもの。
+2

GCで再起動することは許容される解決方法です。どうすればいい?私は 'posix_spawn'を使用して32ビット環境で再起動することができますが、ガベージコレクタを有効にするコントロールは含まれていないようです。 – zneak