1. 程式人生 > 其它 >python利用ctypes呼叫C++動態庫

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;
}
  • 然後再編譯為動態庫,呼叫就沒問題了