Python呼び出しso/.dll

7463 ワード

python呼び出しsoファイル
GCCコンパイルパラメータ解析-shared:動的接続ライブラリの生成を指定します(コネクタにTタイプの書き出し記号テーブルを生成させ、弱い接続Wタイプの書き出し記号を生成させる場合もある)このフラグを使わないと外部プログラムが接続できない.実行可能ファイル-fPICに相当する:位置独立のコードにコンパイルされていることを示し、このオプションを使わないとコンパイルされたコードは位置関連なので動的にロードされる場合はコードコピーによって異なることを満たすプロセスの必要性は、真のコードセグメント共有の目的を達成することはできません.
1.Cダイナミックリンクライブラリを呼び出す
C言語による単純max関数の作成:max.c
/*
 * # -shared                      
 * # -fPIC(Position Independent Code)              
 */
int max(int a,int b)
{
    return a>b?a:b;
}
/*
 * gcc -Wall -g  -fPIC -c max.c -o max.o
 * gcc -shared max.o -o max.so
 * -g -Wall      ,     
*
* gcc max.c -fPIC -shared -o max.so */

コンパイル生成libmax.so
gcc -fPIC -shared max.c -o libmax.so

Python言語でlibmaxを呼び出す.soリンクライブラリのmax関数
from ctypes import cdll
 
cur = cdll.LoadLibrary('./libmax.so')
a = cur.max(1, 2)
 
print(a)

2.C++ダイナミックリンクライブラリを呼び出す
C++によるdisplay.cppの記述
class TestLib  
{  
    public:  
        void display();  
        void display(int a);  
};  
void TestLib::display() {  
    cout<<"First display"<<endl;  
}  
  
void TestLib::display(int a) {  
    cout<<"Second display:"<<a<<endl;  
}  

//C++     python     .so  ,       :
extern "C" {  
    TestLib obj;  
    void display() {  
        obj.display();   
      }  
    void display_int(int a) {  
        obj.display(a);   
      }  
}

コンパイル生成libdisplay.so
g++ -fPIC -shared display.cpp -o libdisplay.so

pythonは生成したlibtestを呼び出す.so
demo.py
import ctypes

so = ctypes.cdll.LoadLibrary   
lib = so("./libpycallclass.so")   

print('display()')  
lib.display()  

print('display(100)')  
lib.display_int(ctypes.c_int(100))

実行:
python demo.py

python呼び出しdllファイル
一時的にリンクを記入します
https://blog.csdn.net/zmnbehappy/article/details/78697185
Prefrence
Pythonインスタンスの概要の3 PythonとC/C++の相互呼び出し