オープンソースのライブラリを使おうとプロジェクトに組み込むと、ビルド時に以下のような「Undefined symbols for architecture armv7:〜」というエラーが表示されてビルドに失敗することがあります。
Undefined symbols for architecture armv7: "_kCGImagePropertyPixelWidth", referenced from: ___59-[SDWebImageDownloaderOperation connection:didReceiveData:]_block_invoke in SDWebImageDownloaderOperation.o
どのようなエラーなのかというと、そのまま「リンク時に該当するオブジェクトが見つからない!」というエラーです。この文章で検索すると、おおよそ2つのパターンの場合に発生するようです。
- 使用しているFrameworkの参照忘れ
- Architecturesの「armv7」が定義されている場合
多くの場合は、前者のFrameworkの参照の漏れが原因だと思います。
今回問題が発生したSDWebImageDownloaderOperation.mを見てみると、ImageIO.hをimportしていました。今回ImageIO.Frameworkが欠けていることが原因で発生しているビルドエラーだと推測できます。
#import "SDWebImageDownloader.h" #import "SDWebImageDownloaderOperation.h" #import <ImageIO/ImageIO.h>
TARGETSの中からエラーが発生しているターゲットを選択して、「Summary」タブの「Linked Frameworks and Libraries」の[+]ボタンをクリックします。
いくつかFrameworkが表示されますので、「ImageIO.Framwork」を選択して[OK]ボタンをクリックします。
以上でビルドエラーが解消されました。今回は、参照忘れのFrameworkの探し方とFrameworkを参照して解決する方法をご紹介させて頂きました。後者の方のアーキテクチャが絡むエラーには巡り会ったことがないので、発生したときに改めて追記させて頂きたいと思います。