2014-03-26 60 views
1

我有以下問題,swig生成的代碼鏈接到錯誤的python安裝

我正在構建一個使用swig包裝C代碼的python模塊。 我已經安裝了python,gcc(45),..使用MacPorts。

這裏有一個最小的設置,其中再現了問題:

兩個文件:

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之一:/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) 

我發現,在test.py線#include <Python.h>的痛飲生成的文件包含。然而,在/ System/Library /中有一個Python.h,而在/ opt/local /中有一個...... 我的猜測是這裏發生了錯誤。但是,我怎樣才能讓編譯器/鏈接器指向正確的?

非常感謝您的幫助! Thomas

+0

我找到了答案,而不是'-I/opt/local/Library ... -lpython',使用'-F/opt/local/Library/Frameworks/-framework python'。 – Thomasillo

回答

1

我沒有mac,但使用distutils處理Linux和Windows上的多個Python版本時,使用swig(swig docdistutil doc)的效果很好。下面顯示了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。