2010年10月14日木曜日

mach-o, but wrong architecture なエラー

PythonからCの実行ファイルを呼び出している最中に突如起こったエラー。
以前コンパイルしたときは起こらなかったのに、半年ぶりにコンパイルしたら発生。
Snow Leopardのアップデートをかけてる内に、何かが変わったらしい。
※ちなみに当家の環境は、OX10.6.4 & Python2.6.1

簡単にググってみた所、やはりアーキテクチャ系(x86_64とかi386とか)の不一致が原因のエラーとのこと。
おかげで便利なコマンドを覚えた。
fileコマンドを使うと、その実行ファイルのアーキテクチャが調べられる。


$ file $(which python)
/usr/bin/python: Mach-O universal binary with 3 architectures
/usr/bin/python (for architecture x86_64): Mach-O 64-bit executable x86_64
/usr/bin/python (for architecture i386): Mach-O executable i386
/usr/bin/python (for architecture ppc7400): Mach-O executable ppc

$ file 今回作ってたpythonから呼び出すcの実行ファイル
cnt.so: Mach-O bundle i386


Pythonは一応i386にも対応している。
ただ、メインはx86_64という話を聞きかじったので、ものは試しにx86_64アーキテクチャを明示してコンパイルしてみる。

Makefile中のコンパイルコマンドの中に-arch x86_64を含めておいた。


$(CC) -fPIC -arch x86_64 $(CFLAGS) -I$(PYLIBS) -o $(SOTARGET).o -c $(SOTARGET).c
$(CC) -arch x86_64 -undefined dynamic_lookup -bundle $(SOTARGET).o -o $(SOTARGET).so


で、その結果をfileコマンドで試してみると以下の通り。


$ file cnt.so
cnt.so: Mach-O 64-bit bundle x86_64


実際、これで実行してみると問題なく動作可能。
良かった良かった。

0 件のコメント: