python利用ctypes调用C++动态库

用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的方式进行编译,编译后的文件中仍然是定义的函数名。有两种方式解决这个问题

  1. 将文件后缀改为.c,然后利用gcc生成动态库
  2. 使用extern "C" {},申明为C,利用g++使用c的方式编译

这里推荐第二种方式

  • 重新写test.cpp文件
#include<iostream>
extern "C"{
        int add(int,int);
}
int add(int a,int b){  // 该函数需要接受三个参数
    return a+b;
}
  • 然后再编译为动态库,调用就没问题了
上一篇:c/c++编写dll进行AES加解密供其他语言调用


下一篇:python shellcode加载器