追記: 201110010
タイトル変更。FreeImageのリコンパイルについてを中心に書き直しました。
openframeworksのiOS版で、iOSシミュレータとiPad2用にFreeImageをリコンパイルする話。
-
解決してみれば、「ダウンロードしたら最初にこれをやれ」って書いてある問題なんだけど、oF007をダウンロードして、そのままXCodeでビルドしてiOSシミュレータでtiff画像を読み込もうとした時に
Detected an attempt to call a symbol in system libraries that is not present on the iPhone:
mktime$UNIX2003 called from function _ZN6LibRaw13get_timestampEi in image imageLoaderExample.
If you are encountering this problem running a simulator binary within gdb, make sure you 'set start-with-shell off' first.
とか出てロードできず、約3日ぐらい詰んでた。藁にも縋る思いでoF Forumに初カキコしたら早速返答が来た(感謝感激)。
ご返答によると「FreeImageライブラリを自分でコンパイルし直してつっこむ」とのこと。
以下、私のやった手順です(
参照先)。
1. FreeImageを
ダウンロードして解凍。
2. この
Makefileをダウンロードして(「Makefile.iphone」として保存)、FreeImageフォルダの中に入れる。そして
GCC_VERSION = 4.2
IPHONEOS_DEPLOYMENT_TARGET = 4.3
MACOSX_DEPLOYMENT_TARGET = 10.7
PLATFORM_SIM = iPhoneSimulator
PLATFORM_PHONE = iPhoneOS
ARCH_SIM = i686
ARCH_PHONE = armv6
この辺を自分の環境に合わせて変更。
うちはMAC OS10.7でXCodeのiOS SDKのバージョンが4.3だったのでそれに変更。それからシミュレータとiPad実機はアーキテクチャが違い、iPadはARM(7)であるのに対し、実機はMac OSのアーキテクチャに依存する。うちはシミュレータの時、アーキテクチャがi686じゃなくてi386だったのでそれに変更(ターミナルから「arch」コマンドを打つと自分のマシンのアーキテクチャがわかる)。Makefileの下の方にも「i686」があったので、全置換。
で、うちはiPad2用に使いたかったので、「ARCH_PHONE」を「armv7」に変更した。下の方にも「armv6」があるので全置換でいいと思う。
ちなみにXCode4.2+iOS5だと苦労する(コンパイラのGCCが無くなってLLVM-GCCになってたりする)のでXCode4.1+iOS4.3でやった方が無難だと思う。
うちの設定だとこんな感じ↓
Makefile.iphone
# Configuration for iPhone OS, making static libs
# this will generate both iPhone (arm) and iPhoneSimulator (i386) libs
include Makefile.srcs
CFLAGS = -g -O2 -Wall -Wmissing-prototypes -std=c99 -ffast-math -fno-strict-aliasing
CXXFLAGS = -g -O2 -Wall -fno-strict-aliasing
GCC_VERSION = 4.2
IPHONEOS_DEPLOYMENT_TARGET = 4.3
MACOSX_DEPLOYMENT_TARGET = 10.7
PLATFORM_SIM = iPhoneSimulator
PLATFORM_PHONE = iPhoneOS
ARCH_SIM = i386
ARCH_PHONE = armv7
PLATFORM_SIM_DEVELOPER_BIN_DIR = /Developer/Platforms/$(PLATFORM_SIM).platform/Developer/usr/bin
PLATFORM_PHONE_DEVELOPER_BIN_DIR = /Developer/Platforms/$(PLATFORM_PHONE).platform/Developer/usr/bin
SDKROOT_SIM = /Developer/Platforms/$(PLATFORM_SIM).platform/Developer/SDKs/$(PLATFORM_SIM)$(IPHONEOS_DEPLOYMENT_TARGET).sdk
SDKROOT_PHONE = /Developer/Platforms/$(PLATFORM_PHONE).platform/Developer/SDKs/$(PLATFORM_PHONE)$(IPHONEOS_DEPLOYMENT_TARGET).sdk
EXTRA_CFLAGS_SIM += -arch $(ARCH_SIM) -pipe -mdynamic-no-pic -fvisibility=hidden $(INCLUDE) -isysroot $(SDKROOT_SIM)
EXTRA_LDFLAGS_SIM += -arch $(ARCH_SIM) -isysroot $(SDKROOT_SIM) -Wl,-dead_strip
EXTRA_CFLAGS_SIM += -D__IPHONE_OS_VERSION_MIN_REQUIRED=20000 -mmacosx-version-min=$(MACOSX_DEPLOYMENT_TARGET)
EXTRA_LDFLAGS_SIM += -mmacosx-version-min=$(MACOSX_DEPLOYMENT_TARGET)
EXTRA_CFLAGS_PHONE += -arch $(ARCH_PHONE) -pipe -mdynamic-no-pic -fvisibility=hidden $(INCLUDE) -isysroot $(SDKROOT_PHONE)
EXTRA_LDFLAGS_PHONE += -arch $(ARCH_PHONE) -isysroot $(SDKROOT_PHONE) -Wl,-dead_strip
EXTRA_CFLAGS_PHONE += -miphoneos-version-min=$(IPHONEOS_DEPLOYMENT_TARGET)
EXTRA_LDFLAGS_PHONE += -miphoneos-version-min=$(IPHONEOS_DEPLOYMENT_TARGET)
AR_SIM = $(PLATFORM_SIM_DEVELOPER_BIN_DIR)/ar
AR_PHONE = $(PLATFORM_PHONE_DEVELOPER_BIN_DIR)/ar
CC_SIM = $(PLATFORM_SIM_DEVELOPER_BIN_DIR)/gcc-$(GCC_VERSION)
CC_PHONE = $(PLATFORM_PHONE_DEVELOPER_BIN_DIR)/gcc-$(GCC_VERSION)
CFLAGS_SIM = $(CFLAGS) $(EXTRA_CFLAGS_SIM)
LDFLAGS_SIM = $(EXTRA_LDFLAGS_SIM)
CXX_SIM = $(PLATFORM_SIM_DEVELOPER_BIN_DIR)/g++-$(GCC_VERSION)
CXXFLAGS_SIM += $(EXTRA_CFLAGS_SIM) -fvisibility-inlines-hidden
LIBTOOL_SIM = /Developer/Platforms/$(PLATFORM_SIM).platform/Developer/usr/bin/libtool
CFLAGS_PHONE = $(CFLAGS) $(EXTRA_CFLAGS_PHONE)
LDFLAGS_PHONE += $(EXTRA_LDFLAGS_PHONE)
CXX_PHONE = $(PLATFORM_PHONE_DEVELOPER_BIN_DIR)/g++-$(GCC_VERSION)
CXXFLAGS_PHONE += $(EXTRA_CFLAGS_PHONE) -fvisibility-inlines-hidden
LIBTOOL_PHONE = /Developer/Platforms/$(PLATFORM_PHONE).platform/Developer/usr/bin/libtool
TARGET = freeimage
STATICLIB_SIM = lib$(TARGET)-iphonesimulator.a
STATICLIB_PHONE = lib$(TARGET)-iphone.a
HEADER = Source/FreeImage.h
.SUFFIXES: .o-i386 .o-arm
MODULES_ARM = $(SRCS:.c=.o-arm)
MODULES_ARM := $(MODULES_ARM:.cpp=.o-arm)
MODULES_i386 = $(SRCS:.c=.o-i386)
MODULES_i386 := $(MODULES_i386:.cpp=.o-i386)
default: all
all: dist
dist: FreeImage
cp *.a Dist
cp Source/FreeImage.h Dist
FreeImage: $(STATICLIB_SIM) $(STATICLIB_PHONE)
$(STATICLIB_SIM): $(MODULES_i386)
$(LIBTOOL_SIM) -arch_only i386 -o $@ $(MODULES_i386)
.c.o-i386:
$(CC_SIM) $(CFLAGS_SIM) -c $< -o $@
.cpp.o-i386:
$(CXX_SIM) $(CXXFLAGS_SIM) -c $< -o $@
$(STATICLIB_PHONE): $(MODULES_ARM)
$(LIBTOOL_PHONE) -arch_only armv7 -o $@ $(MODULES_ARM)
.c.o-arm:
$(CC_PHONE) $(CFLAGS_PHONE) -c $< -o $@
.cpp.o-arm:
$(CXX_PHONE) $(CXXFLAGS_PHONE) -c $< -o $@
clean:
rm -f core Dist/*.* u2dtmp* $(MODULES_i386) $(MODULES_ARM) $(STATICLIB_SIM) $(STATICLIB_PHONE)
3. ターミナルからcdでFreeImageまで移動し、Makefileをmake -f Makefile.iphoneで実行する。
4. 実行後できたlibfreeimage-iphone.aとlibfreeimage-iphonesimulator.aをoFの/libs/FreeImage/lib/iphoneの中に入れる。
5. oFの適当なexampleをコピーし、開き、Targets -> Build SettingsのUser-Defined以下LIB_FREEIMAGE_IPHONEを→後述。
"$(OF_PATH)/libs/FreeImage/lib/iphone/libfreeimage-iphone.a" "$(OF_PATH)/libs/FreeImage/lib/iphone/libfreeimage-iphonesimulator.a"
に変更。
OF_CORE_LIBSの
$(LIB_FREEIMAGE)
を削除。
そして、XCodeのソースツリーの「libs」にoF/libs/FreeImageフォルダを追加。そしてソースツリーの「openFrameworks>iPhone+OF Lib.xcodeproj」を選択し、Build Settingsの「Architectures」を「Optimized (armv7)」に。
「Valid Architectures」を「i386」「armv7」に。
下の方の「LIB_FREEIMAGE_IPHONE」を「"$(OF_PATH)/libs/FreeImage/lib/iphone/libfreeimage-iphone.a" "$(OF_PATH)/libs/FreeImage/lib/iphone/libfreeimage-iphonesimulator.a"」に。
これらはPROJECTとTARGETSの両方にやる必要がある。
それからソースツリーの「○○Example」をクリックして、同様のビルド設定をする。
それからiOSシミュレータをリセットする必要があるので、iOSシミュレータを起動してメニューからiOSシミュレータ>「コンテンツと設定をリセット」。
これでビルドすればFreeImageに関してはいけた。
あとはgluとfreetypeも必要に応じてリコンパイルをやらなくてはいけない。でもfreetypeのだけはうまくいかず、現状のoFのライブラリを突っ込み直したら普通に通った。多分アーキテクチャの設定を明示したからだろうな。