3

我需要使用distutils(和/或setuptools)進行C擴展,它可以在運行時和編譯時(爲了不同的目的)動態使用。這在Linux上不是問題,但是它是OS X上的一個問題。默認情況下,distutils在OS X上創建一個「包」(並將其命名爲.so),它可以在運行時使用,但不能在編譯時使用。我需要編譯一個.dylib,它可以在編譯時鏈接到,我需要在setup.py中執行,我可以將其打包爲PyPI。如何使用distutils和/或setuptools在mac os x上創建.dylib C擴展?

無論我嘗試什麼,distutils都不斷創建一個包,並且當我嘗試鏈接該庫時,出現錯誤。您可以顯式檢查的distutils是否創建一個包或使用命令行上的文件動態鏈接庫:

file libA.so 
libA.so: Mach-O 64-bit bundle x86_64 

下cc命令給我我想要的東西:

cc -fPIC -shared source1.o source2.o -o libA.so 
file libA.so 
libA.so: Mach-O 64-bit dynamically linked shared library x86_64 

回答

2

下面是我工作(在我的setup.py加行):

if sys.platform == 'darwin': 
    from distutils import sysconfig 
    vars = sysconfig.get_config_vars() 
    vars['LDSHARED'] = vars['LDSHARED'].replace('-bundle', '-dynamiclib') 

這種配置似乎模塊_sysconfigdata中要硬接線。它也可覆蓋的使用環境變量,所以這個作品,以及:

LDSHARED="cc -dynamiclib -undefined dynamic_lookup -arch x86_64 -arch i386 -Wl,-F." python setup.py install 
+0

對不起響應晚了,但我只是嘗試這樣做,而且這兩種方法留給我一個「捆綁」後,我用'文件檢查libA.so' (或者如果我嘗試編譯鏈接libA.so我得到相同'不能鏈接捆綁,只有dylibs'錯誤)。有什麼建議麼? – Dan

+1

在「setup.py build」的輸出中,在「'build build_ext'」下面,它顯示了用於編譯和鏈接的實際命令行。查看鏈接命令(最後一個創建.so文件),是否受LDSHARED def影響?或者通過'sysconfig.get_config_vars()'中的其他環境變量?如果是這樣,也許你可以嘗試調整這些變量。如果一切都失敗了,你可以調試distutils/command/build_ext.py來看看它是如何爲'self.compiler.link_shared_object()'生成參數的。希望這可以幫助。 –

+0

我很明顯錯過了一些重要的東西,因爲我再次嘗試,現在我不僅得到了一個動態鏈接的庫,而且現在也無法獲得一個包(我需要兩個用於不同的目的)。我嘗試了相同的代碼,但切換替換(' - dynamiclib',' - bundle'),並仍然獲得動態鏈接庫。當我打印sysconfig.get_config_vars()時,我得到所有-bundle並且沒有-dynamiclib。你的調試建議是非常有用的,但是當我嘗試python setup.py構建時,我得到「正在運行build_ext」,但在它下面沒有輸出。有任何想法嗎?非常感謝你的幫助。 – Dan