为f2py

时间:2018-01-04 13:51:58

标签: python c++ c f2py

我可以使用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.cfoo.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导入时会出现相同的未定义符号错误

1 个答案:

答案 0 :(得分:2)

啊,这几乎肯定是名称损坏的问题。

C ++名称在链接器中保存得更复杂,并且已经损坏了#34;名字比他们的&#34; C&#34;对应物,以区分C ++允许的重载名称,即使对于非类函数也是如此。

您可以将函数声明为extern "C",以便使用C命名约定导出它。该函数的主体仍然可以使用c ++功能,但它应该对f2py或类似功能可见。

请注意,这会阻止您对该函数名称使用C ++名称重载。