【发布时间】:2021-10-12 10:35:23
【问题描述】:
我有 Ubuntu-20.04、Anaconda-3(安装到用户目录中)和 Python-3.7.9 和 SWIG-4.0。
这是我的文件。
a.h:
void foo(void);
a.c:
#include <stdio.h>
#include "a.h"
void foo(void) { printf("Foo!\n"); }
a.i:
%module a
%inline %{
#include "a.h"
%}
test.py:
import a
a.foo()
编译脚本compile.sh:
A=$HOME/opt/anaconda3
I=$A/include/python3.7m
gcc -c -fpic -DHAVE_CONFIG_H -I$I a.c
$A/bin/swig -python -py3 a.i
gcc -c -fpic -DHAVE_CONFIG_H -I$I a_wrap.c
gcc -shared a.o a_wrap.o -o _a.so
编译后测试脚本产生
Traceback (most recent call last):
File "test.py", line 2, in <module>
a.foo()
AttributeError: module 'a' has no attribute 'foo'
但是,如果我写一个更长的接口文件,一切都OK:
%module a
%{
#include "a.h"
%}
%include "a.h"
UPD @Jens 建议在第一个(短)接口文件中将 # 替换为 %。在这种情况下,我得到了
a_wrap.c:2701:1: error: expected identifier or '(' before '%' token
2701 | %include "a.h"
| ^
a_wrap.c:2720:12: error: '_wrap_foo' undeclared here (not in a function)
2720 | { "foo", _wrap_foo, METH_NOARGS, NULL},
| ^~~~~~~~~
gcc: error: a_wrap.o: No such file or directory
【问题讨论】:
-
在您的帖子中描述您在第一次运行时如何调用 swig 以及您正在采取哪些步骤来编译示例是有意义的。正如您所说,对于较长的接口文件一切正常,可能在那里找到原因。
-
你需要
%include让 SWIG 知道 foo -
@amo-ej1:完成。