Xcode 4.2 でビルドしたバイナリを iPhone 3GS で実行できない場合 : Objective-C プログラミング

PROGRAM


Xcode 4.2 でビルドしたバイナリを iPhone 3GS で実行できない場合

iOS 5 SDK が搭載された Xcode 4.2 でプロジェクトをビルドした時に、そのバイナリが iOS 4.3.5 を搭載した iPhone 3GS で実行できないことがありました。

エラーの状況

Debug ビルドでも Release ビルドでも、実行直後にエラーで停止してしまって、次のエラーが表示されてしまいました。

GNU gdb 6.3.50-20050815 (Apple version gdb-1708) (Fri Sep 16 06:56:50 UTC 2011)

Copyright 2004 Free Software Foundation, Inc.

GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions.

Type "show copying" to see the conditions.

There is absolutely no warranty for GDB. Type "show warranty" for details.

This GDB was configured as "--host=i386-apple-darwin --target=arm-apple-darwin".tty /dev/ttys005

warning: Unable to read symbols from "libc++.1.dylib" (not yet mapped into memory).

target remote-mobile /tmp/.XcodeGDBRemote-152-54

Switching to remote-macosx protocol

mem 0x1000 0x3fffffff cache

mem 0x40000000 0xffffffff none

mem 0x00000000 0x0fff none

[Switching to process 11779 thread 0x2e03]

[Switching to process 11779 thread 0x2e03]

warning: No copy of <No file name> found locally, reading from memory on remote device. This may slow down the debug session.

warning: No copy of <No file name> found locally, reading from memory on remote device. This may slow down the debug session.

sharedlibrary apply-load-rules all

warning: No copy of <No file name> found locally, reading from memory on remote device. This may slow down the debug session.

warning: No copy of <No file name> found locally, reading from memory on remote device. This may slow down the debug session.

dyld: Library not loaded: /usr/lib/libc++.1.dylib

Referenced from: /var/mobile/Applications/91629075-FF68-4FF1-A0D8-952915B8F1FF/EzIPPhone4.app/EzIPPhone4

Reason: image not found
kill

quit

Program ended with exit code: 0

エラーメッセージの様子から、今回の問題が C++ ライブラリに起因することは安易に想像できますけれど、iOS 5.0 を搭載した iPhone 4S や iPhone 4 では問題なく動作するだけに、なかなか不思議な感じです。

試しに "libc++.1.dylib" をリンクしてみたり、"libc++.dylib" のリンクを外してみたりもしましたけど、改善される気配はありませんでした。

プロジェクトの状況

今回のプロジェクトでは、静的ライブラリをリンクしていて、その静的ライブラリでは Objective-C++ を利用していたのですけど、プロジェクト自体では Objective-C だけでプログラミングしていたことが、影響していた様子です。

Xcode では、Objective-C++ を使用している場合には、自動的に C++ ライブラリを組み込んでくれるようになっているのですけど、今回のような場合、プロジェクト自体では Objective-C++ を使用していないため、Objective-C++ を使った静的ライブラリをリンクしても、C++ ライブラリは自動では組み込まれないようです。

そのため、通常は自分で "libc++.dylib" をリンクさせて、それで問題なさそうだったのですけど、今回の iPhone 3GS + iOS 4.3.5 環境で、問題が表面化してきた感じです。

エラーを解消する

今回のエラーを解消するための方法としては、いくつか存在するようでした。

 

ひとつは、ライブラリとして "libc++.dylib" ではなく "libstdc++.dylib" をリンクさせる方法です。

このようにすることで、リンクエラーも発生することなく、iPhone 3GS でバイナリを実行することができました。iPhone 4S でも "libstdc++.dylib" で動作するようでしたので、手動でリンクする場合には "libstdc++.dylib" を使用するのが良いかもしれません。

 

もうひとつの方法としては、プロジェクト内で Objective-C++ を少しでも使う方法です。

Objective-C のコードであれば Objective-C++ として使用しても影響のない場合も多いと思うので、どれか影響がなさそうなソースコードをひとつでも、拡張子を ".m" から ".mm" に変更してあげます。

そうすることで、プロジェクト内に Objective-C++ が存在するため、コンパイラーが適切な C++ ライブラリを自動的に組み込んでくれるようになります。

[ もどる ]