使用f2py封装C++代码时出现未定义符号的问题求助
解决f2py封装C++代码时的未定义符号问题
问题根源
你遇到的undefined symbol: func_错误,核心原因是C++的名字修饰(Name Mangling)机制:C++编译器会为函数生成带有类型信息的修饰名(比如func会变成类似_Z4funciPi的符号),但f2py根据接口文件里的intent(c) func声明,会去寻找C风格的未修饰符号(这里是func_,不同平台可能略有差异),两者不匹配就导致了符号找不到。
解决方案:用extern "C"让C++函数按C规则导出
只需要修改你的foo.cpp文件,用extern "C"包裹目标函数,告诉C++编译器以C语言的链接规则生成符号,避免名字修饰:
#include <stdio.h> extern "C" { void func(int n, int * a) { printf("%d\n", n); } }
之后重新执行编译命令:
f2py foo.pyf -c foo.cpp -m foo
现在再运行测试代码import numpy as np; import foo; foo.func(np.ones(3))就能正常输出3了。
关键注意事项
- 接口文件里的
intent(c) func必须保留:这行是告诉f2py该函数遵循C语言的调用约定,去掉它的话,即使是C代码也会出现同样的未定义符号错误,就像你补充说明里提到的情况。 - 如果你的C++代码里有多个要导出的函数,都可以放在同一个
extern "C"块里,或者分别用extern "C"声明。
可行性说明
完全可行!只要处理好C的名字修饰问题,f2py可以很好地兼容C代码,本质上是让C++函数以C的接口暴露给f2py,利用f2py的C封装能力来完成Python绑定。
内容的提问来源于stack exchange,提问作者Matt Hancock
相关产品推荐
相关产品推荐

