Macos 如何使用distutils和/或setuptools在mac os x上创建.dylib C扩展?

Macos 如何使用distutils和/或setuptools在mac os x上创建.dylib C扩展?,macos,shared-libraries,setuptools,distutils,python-c-extension,Macos,Shared Libraries,Setuptools,Distutils,Python C Extension,我需要使用distutils(和/或setuptools)创建一个C扩展,该扩展既可以在运行时动态使用,也可以在编译时动态使用(用于不同的目的)。这在Linux上不是问题,但在OSX上是问题。默认情况下,distutils在OSX上创建一个“bundle”(并将其命名为.so),可以在运行时使用,但不能在编译时使用。我需要制作一个.dylib,可以在编译时链接到它,我需要在setup.py中完成它,我可以为PyPI打包 无论我尝试什么,distutils都会不断创建一个bundle,当我尝试链接

我需要使用distutils(和/或setuptools)创建一个C扩展,该扩展既可以在运行时动态使用,也可以在编译时动态使用(用于不同的目的)。这在Linux上不是问题,但在OSX上是问题。默认情况下,distutils在OSX上创建一个“bundle”(并将其命名为.so),可以在运行时使用,但不能在编译时使用。我需要制作一个.dylib,可以在编译时链接到它,我需要在setup.py中完成它,我可以为PyPI打包

无论我尝试什么,distutils都会不断创建一个bundle,当我尝试链接这个库时,我会得到一个错误。您可以使用命令行上的文件显式检查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
以下是对我有用的内容(在my
setup.py中添加了行):

此配置似乎是在模块
\u sysconfigdata
中硬连线的。它还可以使用环境变量重写,因此也可以这样做:

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

很抱歉,响应太晚,但我刚刚尝试了这一点,在检查
文件libA.so
后,这两种方法都给我留下了一个“bundle”(或者如果我尝试编译linking libA.so,我会得到相同的“无法链接到bundle,只有dylibs”错误)。有什么建议吗?在
setup.py build
的输出中,在“
运行build\u ext
”下,它显示了用于编译和链接的实际命令行。看看link命令(创建.so文件的最后一个命令),它是否受ldshareddef的影响?或者由
sysconfig.get\u config\u vars()中的其他环境变量执行
?如果是这样,也许您可以尝试调整这些变量。如果所有其他操作都失败,您可以调试
distutils/command/build\u ext.py
,查看它如何生成
self.compiler.link\u shared\u object()的参数。希望这能有所帮助。我显然错过了一些重要的东西,因为我再试了一次,现在我不仅得到了一个动态链接库,而且现在无法得到一个捆绑包(我需要两者用于不同的目的)。我尝试了相同的代码,但切换了replace('-dynamiclib','-bundle'),仍然得到了一个动态链接的库。当我打印sysconfig.get_config_vars()时,我会得到all-bundle和no-dynamiclib。您的调试建议非常有用,但是当我尝试python setup.py build时,我得到了“running build_ext”,但下面没有输出。有什么想法吗?非常感谢您的帮助。您确定在这种情况下构建成功吗?也许您需要删除
build
文件夹来重新构建?非常感谢!这同时解决了两个问题。删除build文件夹会显示所有的print语句(因为某些东西实际上正在生成!),并根据需要使用您的代码为我提供一个捆绑包或动态链接库。愚蠢的错误!setup.py在安装之前清理目录是否是一种良好的做法?大多数人都会用pip安装我的软件包。
LDSHARED="cc -dynamiclib -undefined dynamic_lookup -arch x86_64 -arch i386 -Wl,-F." python setup.py install