我可以使用f2py
包装C函数,如下所示:
foo.c的
#include <stdio.h>
void func(int n, int * a) {
printf("%d\n", n);
}
相应的接口文件是
foo.pyf
python module foo
interface
subroutine func(n, a)
intent(c) func
intent(c)
integer, intent(hide) :: n = shape(a,0)
real(kind=8), dimension(n), intent(in) :: a
end subroutine func
end interface
end python module foo
然后,我执行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_
我必须应用什么魔法让f2py
使用C ++代码?有可能吗?
附加说明:
如果我删除了接口文件中的行intent(c) foo
,那么foo.c
产生相同的行为,即它与f2py
编译时从Python导入时会出现相同的未定义符号错误
答案 0 :(得分:2)
啊,这几乎肯定是名称损坏的问题。
C ++名称在链接器中保存得更复杂,并且已经损坏了#34;名字比他们的&#34; C&#34;对应物,以区分C ++允许的重载名称,即使对于非类函数也是如此。
您可以将函数声明为extern "C"
,以便使用C命名约定导出它。该函数的主体仍然可以使用c ++功能,但它应该对f2py或类似功能可见。
请注意,这会阻止您对该函数名称使用C ++名称重载。