未找到SWIG符号,在符号名称中引出下划线

时间:2016-12-10 17:18:41

标签: python-3.x swig dlopen

我正在关注SWIG and Python的教程,但是当我尝试在Python中导入已编译的扩展时,我遇到了错误。

Python 3.5.2 (default, Oct 11 2016, 15:01:25)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.38)] on darwin

>>> import _example
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: dlopen(/pat/to/_example.cpython-35m-darwin.so, 2): Symbol not found: _fact
  Referenced from: /path/to/_example.cpython-35m-darwin.so
  Expected in: flat namespace
 in /path/to/_example.cpython-35m-darwin.so

请注意,错误表示无法找到符号_fact。我不确定领先的下划线来自何处,我找不到任何有关如何解决此问题的信息。

以下是example.i(与tutorial中的内容匹配):

%module example

%{
#define SWIG_FILE_WITH_INIT
#include "example.h"
%}

int fact(int n);

example.hexample.c也匹配tutorial中的内容;如有必要,我可以在这里发帖。

这是setup.py

# coding=utf-8
from setuptools import Extension, setup

setup(
  name = 'SWIG Test',
  ext_modules = [Extension('_example', ['example.i'])],
  py_modules = ['example'],
)

这是pip install -e . -v的相关输出:

running build_ext
building '_example' extension
swigging example.i to example_wrap.c
swig -python -o example_wrap.c example.i
creating build
creating build/temp.macosx-10.12-x86_64-3.5
/usr/bin/clang -Wno-unused-result -Wsign-compare -Wunreachable-code -fno-common -dynamic -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -pipe -Os -I/opt/local/Library/Frameworks/Python.framework/Versions/3.5/include/python3.5m -c example_wrap.c -o build/temp.macosx-10.12-x86_64-3.5/example_wrap.o
creating build/lib.macosx-10.12-x86_64-3.5
/usr/bin/clang -bundle -undefined dynamic_lookup -L/opt/local/lib -Wl,-headerpad_max_install_names build/temp.macosx-10.12-x86_64-3.5/example_wrap.o -o build/lib.macosx-10.12-x86_64-3.5/_example.cpython-35m-darwin.so
copying build/lib.macosx-10.12-x86_64-3.5/_example.cpython-35m-darwin.so ->

我试过的一些东西不起作用:

  • fact声明为int fact(int n) asm("fact")(在构建之后,我在导入时获得Symbol not found: fact
  • swig_opts=['-py3']添加到setup.py
  • 中的扩展程序

1 个答案:

答案 0 :(得分:1)

领先的下划线是red herring。事实证明,我忘了在我的扩展程序源中添加example.c

这是setup.py看起来像的样子:

# coding=utf-8
from setuptools import Extension, setup

setup(
  name = 'SWIG Test',
  ext_modules = [Extension('_example', ['example.i', 'example.c'])],
  py_modules = ['example'],
)

请注意,该附加信息在其来源中同时包含example.iexample.c

现在一切都按预期工作(:

Python 3.5.2 (default, Oct 11 2016, 15:01:25)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.38)] on darwin

>>> import example
>>> example.fact(42)
0
>>> example.fact(0)
1
相关问题