例項演示:
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...