web-dev-qa-db-ja.com

Xcode 6.1:ファイルはx86_64用にビルドされましたが、リンクされているアーキテクチャではありません(i386)

.frameworkファイルをコンパイルしてシステムの専用の場所にコピーするutil/extensions用のSwiftフレームワークプロジェクトを作成しました。このファイルを他のプロジェクト(ビルドフェーズ/ライブラリとリンクバイナリ)フレームワークプロジェクトは、Cocoa Touchフレームワークタイプのプロジェクトです(Xcode 6.1プロジェクトテンプレートブラウザーから選択)。

しかし、フレームワークファイルをリンクするプロジェクトをコンパイルしようとすると、次の警告が表示されます。

l swiftutils.framework/swiftutils

他のiOSプロジェクトで有効になるように、フレームワークプロジェクトでできることはありますか?フレームワークプロジェクトは、他のCocoa Touch(IOS)プロジェクトと自然に連携するCocoa Touch Frameworkプロジェクトであるため、混乱を招きませんか?

39
BadmintonCat

i386およびx86_64 libのビルド設定のアーキテクチャにリストされています。また、アクティブアーキテクチャのみをビルドを明示的にいいえに設定します。

33
dogsgod

受け入れられた答えで問題は解決しましたが、問題はアーキテクチャに関するものであり、文字通りバイナリファイルであるため、もう少し詳しく説明します。

1。 iOSのアーキテクチャ

armv64:iPhoneX、iPhone 5s-8、iPad Air-iPad Pro

armv7:iPhone3Gs-5c、iPad WIFI(第4世代)

armv6:iPhone-iPhone3G

実際のデバイスの場合は上記

i386:32ビットシミュレーター

x86_64:64ビットシミュレーター

上記のリストは下位互換性があります。つまり、iPhoneXはarmv6でも実行でき、armv64の機能を完全に利用することはできません。

iOSアーキテクチャの詳細については、こちらをご覧ください。 https://developer.Apple.com/library/content/documentation/DeviceInformation/Reference/iOSDeviceCompatibility/DeviceCompatibilityMatrix/DeviceCompatibilityMatrix.html

2。 Build Active Architecture Onlyとは何ですか?

「はい」を選択した場合、フレームワークは「選択されたデバイス」、実際のデバイス(armv)またはシミュレーター(x86_64またはi386)にのみビルドされます。 「いいえ」の場合、「有効なアーキテクチャ」のリストにフレームワークを構築します

デフォルトでは、デバッグモードでは「はい」です。さらにリリースでは、「いいえ」であり、デバッグモードでのコンパイル時間を節約し、指定したすべてのアーキテクチャでリリースプロジェクトフレームワークを確実に実行できます。

そのため、フレームワークをすべてのアーキテクチャ用に強制することで受け入れられた答えが機能しましたが、詳細を読むと、背後にあるものがわかり、フレームワークのコンパイルにかかる時間を確実に節約できます。もちろん、あなた自身でもより多くのコントロールができます。

したがって、フレームワークで作業していて、別のプロジェクトにインポートする場合、Build Active Architecture Only「Yes」でフレームワークをコンパイルするとsimulator(i386またはx86_64)、およびBuild Active Architecture Only実デバイス(armv)で「はい」、このエラーが発生します。

エラーの説明を見る:

ファイルはx86_64のために構築されましたが、これはリンクされているアーキテクチャではありません(i386 )は、フレームワークを64ビットシミュレーターでビルドし、マージしたプロジェクトを32ビットシミュレーターでビルドすることを意味します。

より一般的なものは次のとおりです。

フレームワークファイルはx86_64のために構築されましたが、これはリンクされているアーキテクチャではありません(arm64):マージされたプロジェクトが実際のデバイスでビルドされている間に、フレームワークがシミュレーターでビルドされていることを意味します。

3。フレームワークの抽出

一般的な方法は、フレームワークを右クリックしてFinderに表示を選択し、ほとんどの開発者がFinderを開くと、新しくコンパイルされたフレームワークは、閉じずにFinderで古いフレームワークを置き換え、再び開きます。はい、それは正しいですが、ビルドターゲットデバイスを切り替えた場合、フレームワークは異なるフォルダーになります。フレームワークをコンパイルしたと思うこともありますが、実際には別のフォルダーにあります。私の提案は常に選択することですFinderに表示して、インポートするフレームワークが最新のものではないようにします。

2つの異なるフォルダー:Debug-iphoneosおよびDebug-iphonesimulator- enter image description hereenter image description here

9
Edison Lo

私はこの問題に遭遇し、現在のソリューションは元のエラーを取り除きました(つまり、i386をリンクできません)が、リンクされたフレームワーク(Alamofireなど)をプロジェクトにインポートできませんでした。次の解決策はこの問題を修正しました。

  1. ターゲットBuild Settings-> Architectures-> Valid Architecturesで、値i386を追加します。

build settings

  1. 次に、プロジェクトの派生データフォルダーの内容を削除します。このフォルダーの内容はビルド時に生成され、安全に削除でき、Xcodeは新しいフォルダーを作成します。 Xcode 8でこのフォルダーを削除するには、File-> Project/Workspace Settingsに移動し、灰色の矢印をクリックしてFinderでフォルダーの場所を開き、内容を削除します。 derived data folder location

  2. きれいにして再構築します。

  3. それでもビルドが失敗する場合は、Update to recommended settingsと表示されている問題のナビゲーターを確認してください。それをクリックして、もう一度やり直してください。
    このオプションが表示されない場合は、ビルド設定でBuild Active Architecture OnlyYesに変更してください。これにより、ビルド時間が遅くなり、異なるデバイスを頻繁に切り替えるときにイライラすることがありますが、必要になる場合があります。

8
darksinge

また、私がココアポッドを介してフレームワークを使用している場合、Podsプロジェクトに移動し、Podsプロジェクトのすべてのフレームワークターゲットに@dogsgodおよび@darksingeによるソリューションを適用する必要がありました。つまり、アクティブなアーキテクチャのビルドのみをオフにし、有効なアーキテクチャにX86_64とi386を追加する必要がありました。

2

別の理由で、これとまったく同じエラーが発生しました。メインアプリのiOS展開バージョンは10.0で、フレームワークでは11.0でした。 11.0では64ビットのみが許可されているため、フレームワークは64ビットのみでコンパイルされました。そして、アプリが32ビットでフレームワークとリンクしたいとき、私はこの警告を受けました:

file was built for arm64 which is not the architecture being linked (armv7)

もちろん、不足しているフレームワークから多くのシンボルが見つからなかったため、リンカーエラーが続きます。

そのため、フレームワーク上でデプロイメントターゲットをiOS 10.0に変更すると、修正されました。アプリの展開ターゲットをiOS 11.0に変更すると、おそらくそれも修正されます(64ビットのみのバイナリを生成します)。

0
jptsetung

React Native 57.8から58.4にアップグレードすると、このリンカーの問題が発生しました。フレームワークエラーではありませんでした。上記の方法は機能しませんでした。たとえば、SuperCoolという名前のプロジェクトには、ターゲットがあります:SuperCool、SuperCoolTests、SuperCool-tvOS、およびSuperCool-tvOSTests。修正するにはSuperCoolTestsを削除します。

0
Kevin Pham