酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

「Undefined symbols for architecture armv7:〜」という警告が出たときの対策方法

オープンソースのライブラリを使おうとプロジェクトに組み込むと、ビルド時に以下のような「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」の[+]ボタンをクリックします。

f:id:ch3cooh393:20130204103612p:plain

いくつかFrameworkが表示されますので、「ImageIO.Framwork」を選択して[OK]ボタンをクリックします。

f:id:ch3cooh393:20130204103622p:plain

以上でビルドエラーが解消されました。今回は、参照忘れのFrameworkの探し方とFrameworkを参照して解決する方法をご紹介させて頂きました。後者の方のアーキテクチャが絡むエラーには巡り会ったことがないので、発生したときに改めて追記させて頂きたいと思います。