我試圖在MacOSX 10.6上構建一個Python擴展並將其與幾個框架(僅i386)鏈接起來。我使用distutils和Extension對象創建了一個setup.py文件。構建一個python模塊並將其鏈接到MacOSX框架
我爲了反對我的框架,我LDFLAGS鏈接的環境變量應該是這樣的:
LDFLAGS = -lc -arch i386 -framework fwk1 -framework fwk2
,因爲我沒有找到擴展模塊文檔中的任何「框架」的關鍵字,我用了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行,我的鏈接程序會按預期失敗。下面是一個python setup.py構建產生的最後兩行:
/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)
有otool運行的輸出上的測試二進制,克++製成並使用在我的柱的頂部描述的LDFLAGS ldd的。在這個例子中,框架工作確實有效。
$ 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)
可能會將此問題鏈接到鏈接步驟中的「-undefined dynamic_lookup」標誌?我在Google上發現的幾行文檔讓我有點困惑。
乾杯,
非常感謝您的回答。 如果在框架中找不到至少一個拱,連接器似乎不會引用生成的.so文件中的框架。 就我而言,我的框架包含ppc和i386變體。 如果我手動強制鏈接步驟中的-arch標誌爲「i386」,那麼一切工作都正常,包含在MacOSX中的基本python分發版本。如果我在生成的.so文件上運行otool,我可能會發現我的框架。 但是如果我使用系統的默認值-arch i386 -arch ppc -arch x86_64,.so文件沒有鏈接到我的任何框架。 – madflo 2010-04-07 09:50:48
不幸的是,選項1不可用,因爲框架沒有任何源代碼。從我的提供商獲得更新版本似乎是不可能的。 選項2正在工作。謝謝,我幾乎忘了我有一個與macosx捆綁在一起的python二進制文件... 選項3非常奇怪,無法正常工作。正如預期的那樣,在建築物的連接步驟中出現的唯一拱門是i386,但.so並沒有與任何框架相關聯。我會嘗試清除這個問題。 – madflo 2010-04-07 09:54:03