-all_loadリンカーフラグは何をしますか?


123

Objective-Cコードをコンパイルするときに-all_loadフラグが何をするのか、どこにも見つかりません。

バイナリをAppleにアップロードする際にいくつかの問題があります。彼らは、このフラグを使用しなかったためだと言っていますが、コードがそれなしでもコンパイルされます。

誰かが私を助けてくれますか?

ありがとう


2
通常、これで発生するエラーは、アプリケーションの実行時にデバイスで発生します。Appleによるレビューのために提出する前に、実際のハードウェアでアプリケーションをテストしなかったと言っていますか?もしそうなら、それは非常に、非常に悪い考えです。
ブラッドラーソン

私はそれをテストしましたが、私の「配布」構成-App Storeプロビジョニングプロファイルを持つもの-にはフラグがなく、すべてのテストはフラグが付いている開発プロファイルを使用して行われたため、すべてが問題ないように見えます。配布プロファイルを使用してアプリストア用にコンパイルしました。フラグはオフでした。配布プロファイルをローカルにインストールできないため、確認できませんでした。
Guy Ephraim、

回答:


144

おそらくこのテクニカルノートに関連していますhttps://developer.apple.com/library/content/qa/qa1490/_index.html

重要:64ビットおよびiPhone OSアプリケーションの場合、-ObjCがカテゴリのみを含みクラスを含まない静的ライブラリからオブジェクトファイルをロードできないようにするリンカーのバグがあります。回避策は、-all_loadまたは-force_loadフラグを使用することです。-all_loadを指定すると、リンカーは、Objective-Cコードがないものも含めて、参照するすべてのアーカイブからすべてのオブジェクトファイルをロードします。-force_loadはXcode 3.2以降で使用できます。アーカイブの読み込みをより細かく制御できます。各-force_loadオプションの後にはアーカイブへのパスを指定する必要があり、そのアーカイブ内のすべてのオブジェクトファイルがロードされます。


3
はい、これは主にiPhoneの静的ライブラリーと連動します。このリンカーフラグなしでコンパイルされた場合、カテゴリはビルドされたバイナリに含まれず、これらの静的ライブラリを使用するアプリケーションは、iPhone OSハードウェアで実行するとランタイムエラーが発生します。
ブラッド・ラーソン

1
コンパイル時に不足しているメソッドの警告やエラーが発生してはいけませんか?
Guy Ephraim

18
いいえ、カテゴリはコンパイル時に存在するため、最終的なバイナリにリンクされていません。ただし、Obj-Cディスパッチの動的な性質のため、リンカはコードの呼び出しを直接実装メソッドにポイントしないため、コードが欠落していることに気付くことはありません。次に、実行時に、「
Sophistifunk

14
テクニカルノートを明確にしたい場合:ほとんどの場合、-all_loadではなく-ObjCリンカーフラグが必要です。-all_loadは、クラスがなく、カテゴリーのみのライブラリーがある(まれと思います)インスタンスで推奨されます。
Chris Hill

3
stackoverflow.com/a/2615407/62によると、これはXCode 4.2の時点で修正されているため、-all_loadまたは-force_loadフラグは不要になりました。まだ-ObjCが必要です。
Liron Yahdav 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.