簡體   English   中英

帶有C ++模板的SWIG:未定義的符號

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM