我使用C++模板和SWIG遇到了问题。
当我尝试导入我的模块时,出现错误:
ImportError: ./_simple.so: undefined symbol: _Z9double_itIiET_S0_
我将使用SWIG 1.3来进行翻译。
下面是一个简单的例子,展示了问题:
//file: simple.h
template <typename T>
T double_it (T a);
//file: simple.cc
template <typename T>
T double_it (T a) {
return (2 * a);
}
//file: simple.i
%module "simple"
%{
#include "simple.h"
%}
%include "simple.h"
%template(int_double_it) double_it <int>;
%template(float_double_it) double_it <float>;
#file: setup.py
from distutils.core import setup, Extension
simple_module = Extension('_simple',
sources=['simple.i', 'simple.cc'],
swig_opts=['-c++'],
)
setup (name = 'simple',
ext_modules = [simple_module],
py_modules = ["simple"],
)
然后使用以下命令进行构建:
python setup.py build
如果我将simple.cc的内容包含在simple.i中,并从setup.py中删除对simple.cc的引用,则一切都正常,但是当事情变得更加复杂时,这并不是一个真正的解决方案。
接下来,我会举一个相似但不使用模板且运行正常的反例。
//file: simple.h
int double_it (int a);
//file: simple.cc
int double_it (int a) {
return (2 * a);
}
//file: simple.i
//Same as before but with %template statements removed.
%module "simple"
%{
#include "simple.h"
%}
%include "simple.h"
#file: setup.py
#Identical to previous example.