MacOSX 10.6でPython拡張機能を構築し、それをいくつかのフレームワーク(i386のみ)に対してリンクしようとしています。distutilsとExtensionオブジェクトを使用してsetup.pyファイルを作成しました。
フレームワークに対してリンクするように注文すると、LDFLAGSenvvarは次のようになります。
LDFLAGS = -lc -arch i386 -framework fwk1 -framework fwk2
拡張モジュールのドキュメントに「framework」キーワードが見つからなかったため、代わりにextra_link_argsキーワードを使用しました。
Extension('test',
define_macros = [('MAJOR_VERSION', '1'), ,('MINOR_VERSION', '0')],
include_dirs = ['/usr/local/include', 'include/', 'include/vitale'],
extra_link_args = ['-arch i386',
'-framework fwk1',
'-framework fwk2'],
sources = "testmodule.cpp",
language = 'c++' )
すべてが正常にコンパイルおよびリンクされています。extra_link_argsから-framework行を削除すると、期待どおりにリンカーが失敗します。これがpythonsetup.pyビルドによって生成された最後の2行です:
/usr/bin/g++-4.2 -arch x86_64 -arch i386 -isysroot /
-L/opt/local/lib -arch x86_64 -arch i386 -bundle
-undefined dynamic_lookup build/temp.macosx-10.6-intel-2.6/testmodule.o
-o build/lib.macosx-10.6-intel-2.6/test.so
-arch i386 -framework fwk1 -framework fwk2
残念ながら、私が作成した.soは、このフレームワークによって提供されるいくつかのシンボルを見つけることができません。リンクされたフレームワークをotoolで確認してみました。それらのどれも表示されていません。
$ otool -L test.so
test.so:
/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.9.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.0.1)
私の投稿の上部に記載されているLDFLAGSを使用してg++とlddで作成されたテストバイナリで実行されたotoolの出力があります。この例では、-frameworkは機能しました。
$ otool -L vitaosx
vitaosx:
/Library/Frameworks/fwk1.framework/Versions/A/fwk1 (compatibility version 1.0.0, current version 1.0.0)
/Library/Frameworks/fwk2.framework/Versions/A/fwk2 (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.9.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.0.1)
この問題は、リンク手順の「-undefineddynamic_lookup」フラグにリンクできますか?Googleで見つけた数行のドキュメントに少し混乱しています。
乾杯、