2016-03-11 3 views
9

Я пытаюсь обернуть функцию foo в test.cpp с помощью swig. У меня есть заголовок foo.h, который содержит объявление функции foo. test.cpp зависит от наличия внешнего заголовка ex.h и общего файла объект libex.so, расположенного в /usr/lib64SWIG + setup.py: ImportError: динамический модуль не определяет функцию init (init_foo)

Я следовал за blog post from here.

Я могу построить модуль с python setup.py build_ext --inplace. Однако, когда я пытаюсь импортировать его, я получаю следующую ошибку, и я не уверен, что мне не хватает, поскольку большинство других вопросов с этой ошибкой не используют файл setup.py. Ниже приведен пример того, что у меня есть.

Ошибка на импортера _foo:

>>> import _foo 

ImportError: dynamic module does not define init function (init_foo) 

test.i

%module foo 


%{ 
#pragma warning(disable : 4996) 
#define SWIG_FILE_WITH_INIT 
#include "test.h" 
%} 

%include <std_vector.i> 
%include <std_string.i> 
%include "test.h" 

test.cpp

#include "ex.h" 

void foo(int i){ 
    return; 
}; 

test.h

#include "ex.h" 

void foo(int i); 

setup.py

try: 
    from setuptools.command.build_ext import build_ext 
    from setuptools import setup, Extension, Command 
except: 
    from distutils.command.build_ext import build_ext 
    from distutils import setup, Extension, Command 

foo_module = Extension('_foo', 
         sources=['foo.i' , 'foo.cpp'], 
         swig_opts=['-c++'], 
         library_dirs=['/usr/lib64'], 
         libraries=['ex'], 
         include_dirs = ['/usr/include'], 
         extra_compile_args = ['-DNDEBUG', '-DUNIX', '-D__UNIX', '-m64', '-fPIC', '-O2', '-w', '-fmessage-length=0']) 

setup(name='mymodule', 
     ext_modules=[foo_module], 
     py_modules=["foo"], 
    ) 
+0

вы видите это создать файл обруча компиляции сгенерированный файл и связывающий что в модуль? Что-то вроде 'swig -python -C++ -o foo_wrap.cpp foo.i',' gcc ... foo_wrap.cpp ... ',' g ++ ... foo_wrap.o ... 'как в выводе в блоге – Thomas

+0

@Thomas Да, есть длинный/похожий вывод. Я опубликую то, что я вижу в данный момент. – pyCthon

+0

@ Томас вот выход, http://pastebin.com/MSChdNMy – pyCthon

ответ

3

ли похоже, что есть некоторая несогласованность в использовании foo и _foo, так как файл обертка сгенерирована скомпилированы и связаны.

Попробуйте изменить название модуля в test.i от

%module foo 

в

%module _foo 

или корректировки декларации расширения в вашей setup.py от

Extension('_foo', 

к

Extension('foo', 
Смежные вопросы