swig生成的代码链接到错误的python安装

时间:2014-03-26 00:51:53

标签: python macos gcc swig macports

我有以下问题,

我正在使用swig构建一个python模块来包装C代码。 我使用MacPorts安装了python,gcc(45),..

这是一个重现问题的最小设置:

两个文件:

test.i:

%module test
double sum(double a, double b);

test.c的:

double sum(double a, double b){return a+b;}

我跑

$ swig -python  -I. test.i
$ gcc -fPIC -I/opt/local/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7 -c test_wrap.c
$ gcc    -c -o test.o test.c
$ gcc -shared -I/opt/local/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7 -lpython -dynamiclib -fPIC -o _test.so test.o test_wrap.o

当我运行python(MacPorts one:/opt/local/bin/python2.7)并尝试通过import test导入模块时,代码崩溃的问题与上面完全相同。

使用otool检查文件_test.so会产生以下结果:

$ otool -L _test.so
_test.so:
   _test.so (compatibility version 0.0.0, current version 0.0.0)
   /System/Library/Frameworks/Python.framework/Versions/2.7/Python (compatibility version 2.7.0, current version 2.7.2)
   /usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1669.0.0)
   /opt/local/lib/libgcc/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
   /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 169.3.0)

我发现在swig生成的文件test.py中包含了行#include <Python.h>。但是/ System / Library /中有一个Python.h,而/ opt / local /中有一个... 我的猜测是错误发生在这里。但是,如何使编译器/链接器指向正确的?

非常感谢您的帮助!! 托马斯

1 个答案:

答案 0 :(得分:1)

我没有mac,但是在使用swig(swig docdistutil doc)时,通过使用distutils来处理Linux和Windows上的多个Python版本,我有很好的结果。以下显示了setup.py的最小示例:

from distutils.core import setup,Extension
ext = Extension('_test',sources=['test.c,test.i'])
setup(name='test',ext_modules=[ext],py_modules=["test"])

Distutils绑定到调用python版本并且知道swig。但是,通过以下方式进行编译非常重要:

python setup.py build_ext
python setup.py build_py

而不是直接调用build。