F2PY使用C++源时的未定义符号

2024-06-16 04:45:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我可以用f2py包装C函数,如下所示:

foo.c

#include <stdio.h>

void func(int n, int * a) {
    printf("%d\n", n);
}

对应的接口文件是

foo.pyf

^{pr2}$

然后,我执行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_
<> P>我必须应用什么魔法使^ {CD1>}与C++代码一起工作?有可能吗?在

附加说明:

如果我删除接口文件中的intent(c) foo,那么foo.c会产生相同的行为,也就是说,当从Python导入时,f2py会产生相同的未定义符号错误。在


Tags: 文件函数代码importfooincludenp符号
1条回答
网友
1楼 · 发布于 2024-06-16 04:45:00

啊,这几乎可以肯定是一个关于名字混乱的问题。在

C++名称与链接的“C”对应,在链接器中保存了比“C”更复杂的名称,以便区分C++允许的非类函数的重载名称。在

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

注意,这会阻止您在函数名上使用C++名称重载。在

相关问题 更多 >