用swig 封裝C 動態庫的實踐

2021-09-19 19:12:58 字數 2035 閱讀 3886

python 呼叫c++ 有很多方案。 swig 還是比較好用的。

需求: 假設有乙個現成的c++ 庫 a.so 和 標頭檔案 a.h 如何通過python 來呼叫 a.so 裡面的功能介面。

最開始我誤認為必須有 a.so 的源**cpp和a.h 才行。實踐過發現,不需要源**,swig可以根據標頭檔案就自動生成乙個可以供python呼叫的橋接so庫的**,在編譯這個**的時候,只要把a.so鏈結進去,就萬事大吉了。

具體實現過程如下:

1,建立乙個swig的 ***.i 配置檔案,如: mod_a.i ,  

/* file: mod_a.i */

%module mod_a

%%include "../include/a.h"

這個檔案中,有兩個include,第乙個#include是最終整合到wrap**裡面的。 第二個是swig 的輸入。這兩個路徑可以不同,主要取決於 swig輸出的目標cxx檔案 和 mod_a.i 所在目錄。

2,用swig 生成 橋接用的**。可以執行命令:

swig -c++ -python mod_a.i
這個命令執行後,就會在mod_a.i 所在的目錄下生成兩個檔案:mod_a.py 和 mod_a_wrap.cxx

mod_a.py 是供python呼叫的介面,在python import的時候自動會呼叫,不需要關注。 mod_a_wrap.cxx這個檔案就是橋接庫的c++**,需要將這個**編譯成名為"_mod_a.so" 的so庫, 注意名稱前面必須有下劃線,而在python import 的是mod_a。

3, 編譯 橋接so庫。這裡我們採用g++ 命令來編譯:

g++ -fpic -shared mod_a_wrap.cxx -o _mod_a.so -i/usr/include/python2.7/ -lpython2.7 -la -l./lib
也可以通過cmake 來配置:

cmake_minimum_required(version 2.8.3)

project(a)

set(cmake_cxx_flags "-std=c++11 ")

set(depend_lib_dir ../dep_lib)

link_directories(

./$

)include_directories(

$/include

./include

/usr/include/python2.7/

)add_library(a shared

./src/a.cpp

)target_link_libraries(a

dlrt

pthread

)execute_process( command swig -c++ -python -outdir $ -o $/mod_a_wrap.cxx $/src/mod_a.i

command cp ./src/test_main.py $/a/

)message( "output swig py files to $ ")

message( "output swig cxx files to $/mod_a_wrap.cxx ")

add_library(mod_a shared

$/mod_a_wrap.cxx

)target_link_libraries(mod_a

apython2.7 )

# output_name "_mod_a.so"

set_target_properties(mod_a properties prefix "_")

這裡為了剝離build和src 目錄,用到swig的兩個引數  -outdir 制定.py 檔案的輸出目錄,-o 指定 wrap.cxx檔案的輸出路徑+名稱。

4,最後就是在python 裡面 呼叫介面。

如:import mod_a 

具體測試用例可以放在   ./src/test_main.py中去。

動態庫的封裝

以 add.c 為例 1.建立庫函式的原始檔 vim add.c 2.生成目標檔案 gcc c add.c fpic 3.生成動態庫 gcc add.o o libadd.so shared 備註 libadd.so lib是字首,add是庫的名字,so是字尾,代表是動態庫 4.建立呼叫庫函式的原始...

c 動態庫封裝及呼叫(1 動態庫介紹)

1 乙個程式從原始檔編譯生成可執行檔案的步驟 預編譯 編譯 彙編 鏈結 1 預編譯,即預處理,主要處理在源 檔案中以 開始的預編譯指令,如巨集展開 處理條件編譯指令 處理 include指令等。2 編譯過程就是把預處理完的檔案進行一系列詞法分析 語法分析 語義分析以及優化後生成相應的彙編 檔案。3 ...

C 用類的形式封裝動態順序表

在前面已經用c語言實現過了 今天用另一種語言c 以類的形式來實現一下 順序表是在計算機記憶體中以陣列的形式儲存的線性表,線性表的順序儲存是指用一組位址連續的儲存單元依次儲存線性表中的各個元素 使得線性表中在邏輯結構上相鄰的資料元素儲存在相鄰的物理儲存單元中,即通過資料元素物理儲存的相鄰關係來反映資料...