前言
在開發過程中我們有時需要根據不同的語言來開發不同的模組,例如tensorflow就是提供python的介面,同時在底層呼叫了c++的函式。我最近在工作中也遇上了同樣的問題,需要python來呼叫c++的.so庫,在網上找了一圈,沒有很符合我需求的結果,在此記錄下我花了一天時間搞的結果。
測試環境
ubuntu(linux)
操作過程
fedora:
ubuntu:
centos*:
3.使用gdb測試是否可用:
可以看到基本上已經可以使用gdb來對python呼叫的c++共享庫進行除錯了。更進一步的,如果我們想通過vscode來對庫進行視覺化的除錯,又該如何處理呢?
gdb中stl pretty print
我們在使用gdb時,老是會對其顯示的一些stl容器不能很好顯示而感到不爽,從gdb7.0開始,python指令碼匯入gdb中,所以為了能讓gdb中的vector更好的顯示,需要在你的使用者目錄即~下放置乙個.gdbinit檔案和python的資料夾,這樣操作之後,gdb在啟動時就
會執行這個.gdbinit從而對stl容器進行pretty print的支援,具體可以參見gdb wiki的說明(
vscode除錯python呼叫的c++動態庫
開啟vscode->開啟工程資料夾
除錯配置,根據圖1進入launch.json配置頁面
圖1根據圖2所示配置,此處需要講解下attach的原理:attach是gdb的乙個功能,用於對執行中的程式的狀態進行監測,例如一些伺服器中的程序不能直接以launch的方式啟動,就只能以這種方式來監視。我們的專案中也同理,不能直接通過c++啟動,所以需要python首先開啟,然後在hello.cpp中設定getchar()或者pause進行中斷程序,然後通過attach程序的方式來連線除錯。(另外一種更直接的方式是通過上述所說的gdb進行除錯,但這種只能通過gdb命令列的方式,可能習慣ide的人不習慣,所以我找了這種用vscode的方式)
圖2以上配置就完成了
3.執行python主程式
此處貼出我呼叫的c++共享庫的函式部分,由於我是用python呼叫c的函式作為實驗的,所以此處加了extern c,在網上有c++類作為被呼叫的示例。
4.開始除錯
選擇attach物件之後,我的ubuntu上會彈出彈框讓你輸入密碼驗證,有些系統上可能不會。
5.完成除錯,按紅色插頭斷開連線,python程序繼續執行總結
所以attach除錯流程可以總結成:
啟動python程序p,並讓其stop
使用attach方式連線程序p
讓p程序繼續執行,直到斷點位置
除錯ing~~~~
斷開attach,程序p正常執行
python通過共享庫呼叫C函式
例項演示 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 作用於...
CMakeLists呼叫共享庫
so共享庫編寫 建立乙個名為 mysharedlib 的共享庫 cmakelists.txt cmake minimum required version 3.10 project mysharedlib set cmake cxx standard 11 add library mysharedl...
C 呼叫Python並用Winpdb除錯
最近在學習用c 呼叫python,發現用起來還挺方便的,就是在除錯的方面遇到了些問題.大部分python ide都提供了除錯功能,比如eric4,pythonwin,idle等,不是這些ide都不能除錯c 中呼叫的python指令碼.我目前的專案框架是使用mfc寫的,它是乙個關於攝像頭測試的程式,由...