用python调用C++动态库时,总是提示函数未找到,感觉大家也会遇到这种问题,就记录一下
先是错误示范
- 首先编写C++代码,新建test.cpp
int add(int a,int b){
return a+b;
}
- 利用g++生成动态库
g++ test.cpp -fPIC -shared -o libtest.so
- 再编写python调用,新建python_ctypes.py
import ctypes
if __name__ == '__main__':
dl=ctypes.cdll.LoadLibrary
lib=dl('./libtest.so')
a=lib.add(2,3)
print(a)
-
python python_ctypes.py
就会报以下错误
AttributeError: ./libtest.so: undefined symbol: add
经过查阅,发现c++的编译后,为了实现重载,函数名会被改变,这时候要使用使用c的方式进行编译,编译后的文件中仍然是定义的函数名。有两种方式解决这个问题
- 将文件后缀改为.c,然后利用gcc生成动态库
- 使用
extern "C" {}
,申明为C,利用g++使用c的方式编译
这里推荐第二种方式
- 重新写test.cpp文件
#include<iostream>
extern "C"{
int add(int,int);
}
int add(int a,int b){ // 该函数需要接受三个参数
return a+b;
}
- 然后再编译为动态库,调用就没问题了