2012-03-15 14 views
0

実験の数時間、私は、次の例(C++)に問題を軽減するために管理した後:iPhone静的ライブラリクラン/ LLVMエラー:non_lazy_symbol_pointers

extern "C" void foo(); 

struct test 
{ 
    ~test() { } 
}; 

void doTest() 
{ 
    test t; // 1 
    foo(); // 2 
} 

これはXcodeでiOSデバイス用にコンパイルされています4.2、付属のClangコンパイラ(Apple LLVMコンパイラ3.0)とiOS 5.0 SDKを使用してください。プロジェクトはCocoa Touchスタティックライブラリとして設定され、AIRネイティブエクステンションを構築しているため、[共有ライブラリとのリンクを有効にする]が[いいえ]に設定されています。関数fooは別の外部ライブラリで定義されています。 (私の実際のプロジェクトでは、これはAIRネイティブ拡張で使用するためにはAdobeによって定義されたC API機能のいずれかになります)

このコードをコンパイルしようとすると、私はエラーを取り戻す:

FATAL:incompatible feature used: section type non_lazy_symbol_pointers (must specify "-dynamic" to be used) 
clang: error: assembler command failed with exit code 1 (use -v to see invocation) 

1または2のいずれかの行をコメントアウトするか、ビルド設定「共有ライブラリとのリンクを有効にする」を「はい」に変更すると、エラーは消え去ります。 (ただし、ビルド設定を変更した場合は、ライブラリを最終プロジェクトにリンクするときに複数のld warning: unexpected srelocation type 9警告が表示され、デバイス上でアプリケーションがクラッシュします)。testからデストラクタを削除するとビルドエラーもなくなります。

So:これはClangのバグですか?すべての重要かつ未確認のビルド設定が欠落していますか?外部から提供された関数とデストラクタを持つ構造体との相互作用は、最小限にとどめて非常に特有です。

答えて

3

多くの検索の後、私はついにリチャードロードのexcellent blog post on AIR native extensionsを見つけました。効果的な開発では、Adobeがまだ文書化していないようないくつかのフラグを使用する必要があることが判明しています。

かいつまん:

  • 設定をはいに "共有ライブラリとのリンクを有効に"。これを「いいえ」に設定すると、AIRネイティブ拡張を開発する際の最も蔓延している悪いアドバイスが1つしかありません。
  • ADTの-platformsdkオプションを使用して、Appleが提供するiOS SDK(例:-platformsdk /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk)を指定します。これにより、unexpected srelocation type 9の警告が緩和されます。アドビのマニュアルには、-platformsdkはAndroidのみのものだと書かれていますが、それは嘘です。
  • 拡張子をパッケージ化するとき(つまり、ANEファイルを作成するとき)は、文書化されていない-platformoptionsオプションを使用して、追加のリンカー引数を含むxmlファイルを指定します。このXMLファイルの形式も文書化されていませんが、テンプレートはtemplates/extensions/ios/platform-descriptor-template.xmlの下のAIR SDKディレクトリにあります。同じ場所にxsdスキーマもあります。このファイルを使用すると、拡張機能で使用するその他のフレームワークを指定できます。したがって、AIR SDKがサポートするデフォルトのフレームワークに限定されません。
  • 新しいリンカー警告:ld: warning: ARM function not 4-byte alignedが表示されるはずです。これは明らかに無視することができます。アドビはこの問題を認識していると伝えられています。 -wをplatformoptionsファイルのリンカに渡すことでこの警告を消すことができると思いますが、-wのサイレンスすべての警告だけでなく、その警告も注意してください。これは、まだ説明していません

さらに詳しい情報はRajorshiゴーシュ、アドビシステムズ社のエンジニアの1つによってこれら二つのブログの記事で見つけることができます"共有ライブラリとのリンクを有効にする"と、外部で定義された関数と、デストラクタとの間の奇妙なやり取りがありますが、これはブロッキングissuではなく好奇心の問題になりましたe。

+0

AIR以外のケースでも同じ問題が発生しました。主な問題は、あなたの最初の弾丸であり、共有リンクがイエスにリンクして問題を解決したことです。 –

関連する問題