Jos*_* G. 6 python gcc distutils
我想在Mac OSX 10.6.5上编译一个包.包的安装脚本依赖于distutils.问题是计算机的默认gcc是版本4.2(我通过在终端窗口中运行gcc --version来确定这一点)但是当我运行'python setup.py build'时,我从输出中看到distutils正在选择gcc -4.0而不是4.2这是一个很大的问题,因为我使用的代码需要gcc> = 4.2.我没有这台机器的管理员权限,所以作为一个workaroud,我创建了一些将gcc-4.0发送到gcc-4.2的符号链接.结果是代码编译,但生成的.so文件不起作用(当我尝试在python中导入它们时,我得到错误抱怨共享对象中缺少init函数).
我尝试在不同的mac(10.6.6)上编译这个代码,它就像一个魅力:distutils选择4.2而不被强制这样做,我可以毫无问题地导入生成的共享对象.所以,我想要做的是在我的计算机上编译代码,而不必做这个符号链接技巧...我只是想让distutils自动选择4.2.我已经尝试将正确编译的.so文件转移到我的计算机上,但由于多种原因(它们与我的机器上不存在的库链接/与安装的版本不同)失败了.
有没有人在这里有任何建议?
谢谢,乔希
sam*_*ias 16
要强制distutils使用单独的编译器,您可以通过环境重新定义一些变量.首先,找出distutils使用的默认值:
>>> from distutils import sysconfig
>>> sysconfig.get_config_var('LDSHARED')
'gcc-4.0 -Wl,-F. -bundle -undefined dynamic_lookup'
>>> sysconfig.get_config_var('CC')
'gcc-4.0'
Run Code Online (Sandbox Code Playgroud)
接下来你需要重新定义那些,替换你想要使用的gcc版本:
% LDSHARED="gcc-4.2 -Wl,-F. -bundle -undefined dynamic_lookup" CC=gcc-4.2 \
/usr/bin/python setup.py build_ext
Run Code Online (Sandbox Code Playgroud)
请记住,sysconfig默认值是从最初用于编译python的Makefile中提取的,因此用它们捏造可能会产生意想不到的结果:
>>> path = sysconfig.get_python_lib(plat_specific=1, standard_lib=1)
>>> os.path.join(path, 'config', 'Makefile')
'/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/config/Makefile'
Run Code Online (Sandbox Code Playgroud)