python利用ctypes呼叫C++動態庫
阿新 • • 發佈:2021-07-22
用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; }
- 然後再編譯為動態庫,呼叫就沒問題了