python通過共享庫呼叫C函式

2021-09-13 15:45:45 字數 827 閱讀 9611

例項演示:

c語言寫乙個函式,名為pycall.c

#include

#include

intfoo

(int a,

int b)

使用gcc編譯成共享庫。(gcc是c語言的編譯工具,可以編譯c和c++,g++只能比編譯c++)

gcc  -o libpycall.so  -shared -fpic pycall.c
-fpic 作用於編譯階段,告訴編譯器產生與位置無關**(position-independent code),則產生的**中,沒有絕對位址,全部使用相對位址,故而**可以被載入器載入到記憶體的任意位置,都可以正確的執行。這正是共享庫所要求的,共享庫被載入時,在記憶體的位置不是固定的。

從gcc來看,shared應該是包含fpic選項的,但似乎不是所以系統都支援,所以最好顯式加上fpic選項。

-o 選項表示向哪個檔案中寫入庫內容

編寫python程式pycall.py

import ctypes  

ll = ctypes.cdll.loadlibrary

lib = ll(

"./libpycall.so"

)

res=lib.foo(1,

3)print

'res='

,res

執行pycall.py,執行結果為:

除錯Python呼叫的C 共享庫

前言 在開發過程中我們有時需要根據不同的語言來開發不同的模組,例如tensorflow就是提供python的介面,同時在底層呼叫了c 的函式。我最近在工作中也遇上了同樣的問題,需要python來呼叫c 的.so庫,在網上找了一圈,沒有很符合我需求的結果,在此記錄下我花了一天時間搞的結果。測試環境 u...

CMakeLists呼叫共享庫

so共享庫編寫 建立乙個名為 mysharedlib 的共享庫 cmakelists.txt cmake minimum required version 3.10 project mysharedlib set cmake cxx standard 11 add library mysharedl...

python通過ctypes呼叫c動態鏈結庫dll

python端的 如下 customdll cp.cdll.loadlibrary r d project code cppproject cpp utils x64 release getnozerolabelidindex.dll batchsizeloaddata customdll.batc...