關於C和C++混編的一些心得
C和C++混編
專案要求將檢測識別程式和跟蹤程式結合起來使用,識別暫時使用的是海思demo自帶的RFCN識別程式,跟蹤用的是KCF跟蹤演算法。這其中RFCN是純C的程式碼,而KCF是C++程式碼,並且編譯和執行的時候需要連結OPENCV的動態庫。
因為程式執行過程中肯定需要呼叫海思sdk的一些靜態庫檔案或者其他相關檔案,並且海思VI-VPSS-VENC-VO的一系列執行流程已經被涵蓋到RFCN的例子中去了,所以最簡單的辦法當然是以RFCN的demo為主並在上面做改進,在RFCN執行並檢測到目標之後呼叫KCF提供的函式來進行跟蹤。
簡單地記錄一下大概過程:
①因為C++有類這種東西,而C語言沒有,所以方便起見對KCF的類和類內函式進行封裝,KCFTracker類封裝成結構體KCFTracker_s,結構體中唯一的成員是KCFTracker類的一個實體tracker;類內函式外層封裝一層函式,引數提供指向KCFTracker_s的指標和類內函式需要的引數:
struct KCFTracker_s{
KCFTracker tracker;
};
struct KCFTracker_s* createTracker(){
return new KCFTracker_s;
}
void KCFInit(struct KCFTracker_s* pTracker,int xMin,int yMin,int width,int height,unsigned char* dataAddr){
Mat newMat;
RGB2Mat(dataAddr,&newMat,width,height);
pTracker->tracker.init(Rect(xMin,yMin,width,height),newMat);
}
這一層封裝也就是為C提供方便使用的介面,也需要使用g++來編譯。
②因為C和C++對函式的識別符號的編譯方式不同,所以封裝之後的函式需要在標頭檔案的宣告中加上extern "C"的關鍵字,大概是這麼使用的:
#ifndef _KCFWRAPPER_H_
#define _KCFWRAPPER_H_
struct KCFTracker_s;
#ifdef __cplusplus
extern "C"{
#endif
struct KCFTracker_s* createTracker();
void KCFInit(struct KCFTracker_s* pTracker,int xMin,int yMin,int width,int height,unsigned char* dataAddr);
int* KCFUpdate(struct KCFTracker_s* pTracker,unsigned char* dataAddr,int width,int height);
void ReleaseTrakcer(struct KCFTracker_s** ppTracker);
#ifdef __cplusplus
};
#endif
#endif
注意哦,#ifdef __cplusplus這裡的下劃線是有兩段的,如果不小心只寫一段的話g++編譯不會報錯,但是在和RFCN的目標檔案連結的時候是會報錯的,編譯器會指出找不到相關函式的定義。
③編譯順序是分別用g++和gcc編譯好相應的程式碼,然後用gcc來連結。編譯時記得記上-lstdc++ 連結c++的庫。
相關文章
- QT creator 中c和c++混編問題QTC++
- C++和MATLAB混編的問題集錦C++Matlab
- QML::qml與c++混編C++
- ubuntu16.04下MATLAB和C++混編(基於ROS,不含VS類別的編譯器)UbuntuMatlabC++ROS編譯
- [譯] 關於 HTTP/3 的一些心得HTTP
- 關於最近面試的一些心得面試
- Objective-C和Swift混編ObjectSwift
- 關於WiFi密碼破解的一些心得WiFi密碼
- 關於java的引用和c++的區別JavaC++
- 關於C與C++的區別C++
- C++ 反彙編:關於函式呼叫約定C++函式
- C++ 反彙編:關於Switch語句的優化措施C++優化
- [持續更新]——關於C++的一些可能會常用的函式C++函式
- 13、c++有關string的一些操作C++
- 微信小程式 關於父子元件一些心得微信小程式元件
- 關於C++類的定義和物件的建立詳解C++物件
- 關於c、c++之前比較模糊的概念C++
- 關於C++的標頭檔案C++
- 關於C++複製控制C++
- 日常分享:關於時間複雜度和空間複雜度的一些優化心得分享(C#)時間複雜度優化C#
- 如何分析和提高(C/C++)程式的編譯速度?C++編譯
- OC和Swift混編Swift
- cmake混編.c和.cpp需要注意的地方--指定兩種編譯器編譯
- 關於C++當中的“模板函式”C++函式
- C++關於DLL匯出模板類和模板函式C++函式
- 關於C# Span的一些實踐C#
- 關於SCRUM的學習心得Scrum
- 編譯 TensorFlow 的 C/C++ 介面編譯C++
- c++ typedef的一些理解C++
- C++ vector 的一些操作C++
- C#中關於 object,dynamic 一點使用心得C#Object
- 【底層】 C++和C#的編譯方式差異 / AOT和JITC++C#編譯
- 關於C++ scanf的一個小知識C++
- 關於c++ STL map 和 unordered_map 的效率的對比測試C++
- 關於Jpa和Mybatis的一些看法MyBatis
- C++跨平臺庫boost和Poco的編譯C++編譯
- OC和Swift混編經驗Swift
- iOS UMeng OC和Swift混編iOSSwift