我可以用f2py
包装C函数,如下所示:
foo.c
#include <stdio.h>
void func(int n, int * a) {
printf("%d\n", n);
}
对应的接口文件是
^{pr2}$foo.pyf
然后,我执行f2py foo.pyf -c foo.c -m foo
,它创建Python库,例如,代码
import numpy as np
import foo
foo.func( np.ones(3) )
按预期打印3
。在
foo.c
→foo.cpp
会导致未定义的符号通过将foo.c
的扩展名改为foo.cpp
,我注意到
f2py foo.pyf -c foo.cpp -m foo
调用g++
而不是gcc
。好的。但是,当我在Python中执行import foo
时,我看到:
Traceback (most recent call last):
File "<string>", line 1, in <module>
ImportError: ./foo.so: undefined symbol: func_
<> P>我必须应用什么魔法使^ {CD1>}与C++代码一起工作?有可能吗?在附加说明:
如果我删除接口文件中的intent(c) foo
,那么foo.c
会产生相同的行为,也就是说,当从Python导入时,f2py
会产生相同的未定义符号错误。在
啊,这几乎可以肯定是一个关于名字混乱的问题。在
C++名称与链接的“C”对应,在链接器中保存了比“C”更复杂的名称,以便区分C++允许的非类函数的重载名称。在
可以将函数声明为
extern "C"
,以便使用C命名约定导出它。函数体仍然可以使用c++特性,但是它应该对f2py或类似的对象可见。在注意,这会阻止您在函数名上使用C++名称重载。在
相关问题 更多 >
编程相关推荐