2016-12-10 2 views
0

SWIG and Pythonのチュートリアルに従っていますが、Pythonでコンパイルした拡張機能をインポートしようとするとエラーが発生します。SWIGシンボルが見つかりません。シンボル名の先頭にアンダースコアが付きます

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を見つけることができないことを示しています。先頭のアンダースコアがどこから来ているのか分からず、この問題を解決する方法についての情報はありません。ここで

は(tutorialに何があるかと一致する)example.i次のとおりです。

%module example 

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

int fact(int n); 

example.hexample.ctutorialに何があるかと一致します。必要に応じてここに投稿することができます。

はここ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")として(建物の後、私はインポート時に10)。
  • の内線にswig_opts=['-py3']を追加します。

答えて

1

先頭のアンダースコアはred herringでした。私のエクステンションソースにexample.cを含めるのを忘れてしまった。

# 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の両方を持っていることを注意:ここで

setup.pyが見えるようになっているものです。

期待通りに今すべてが(作品:

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 
関連する問題