Xcode
iOS

ld: framework not found IOSurface for architecture arm64

More than 1 year has passed since last update.

いつのまにかこんなエラーが出るようになってしまいました。

ld: framework not found IOSurface for architecture arm64

※arm64の部分は場合によってはarm7だったりarm7sだったりします。

簡単に言うと、Xcode9でビルドしたスタティックライブラリ(.a)等をXcode8でリンクしようとしたときに発生します。正確に言うと、iOS11 SDKでビルドしたものをiOS10以下のSDKでリンクした場合、です。

スタティックライブラリには参照するFrameworkがビルド時に書き込まれるんですが、iOS11からIOSurface.frameworkがPublicなFrameworkになって明示的に書き込まれるようになったものの、iOS10のSDKのFrameworkサーチパスには存在しない、というのが原因でした(iOS10以前でも存在してるけどPrivateFrameworkらしい)。

Xcode9であれば、以下にIOSurface.frameworkがあるはずです。
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks

解決策としては、Xcodeの"Build Settings"の"Apple LLVM 9.0 - Language - Modules"にある"Link Frameworks Automatically"をNoにしてスタティックライブラリをビルドすればFrameworkの参照が書き込まれなくなるのでエラーは出なくなるはずですが、今度はアプリ側の"Build Phases"に必要なFrameworkをちゃんと設定しておかないと、アプリのビルド&リンクでこれまたエラーになると思います。

LinkFrameworksAutomatically.png

そのスタティックライブラリではIOSurfaceを使っているわけではないのでコードの変更ではなんともならず、Xcode9からXcode8に戻すのも手間だし(AppStoreが導入されてからはさらに難しく…)、かといって足並みがそろわないうちにXcode9に上げるのもなんだし、なかなか悩ましい問題なのです。