[英]SWIG with C++ templates: undefined symbol
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.
通常,模板在頭文件中定義,而不是在cc文件中定義。 使用您的設置,編譯器無法找到/編譯模板的實現。
您需要更改代碼的組織,以便模板實現可用:
//file: simple.hh
template <typename T>
T double_it (T a) {
return (2 * a);
}
//file: simple.i
%module "simple"
%{
#include "simple.hh"
%}
%include "simple.hh" // include it directly into here
%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.hh'],
swig_opts=['-c++'],
)
setup (name = 'simple',
ext_modules = [simple_module],
py_modules = ["simple"],
)
我很欣賞你的例子是簡化的,但它說明了這一點。 您不必直接%include
實現(但您需要#include
它),但您必須為SWIG編譯器提供一些實現,即使它是簡化版本。
以上應該讓你去。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.