前言
創建DLL有幾種不同的方式,最簡單直接的的方式就是通過VS自帶的動態鏈接庫(DLL)項目,把相關的功能封裝成一個類,然后導出幾個接口方法,編譯成功以后生成DLL文件,就可以在其他地方跟正常的第三方庫配置之后一樣調用了。
01創建DLL
首先打開VS創建一個DLL空項目,打開VS的桌面向導如下:

創建DLL鏈接庫項目

然后在頭文件中添加mytest.h文件,添加代碼如下:
#pragmaonce #ifdef_DLL_EXPORTS #defineDLL_API_declspec(dllexport) #else #defineDLL_API_declspec(dllimport) #endif #include然后在源文件中添加mytest.cpp文件,添加代碼如下://=========導出函數C++調用接口============ classDLL_APIMyTestDLL{ public: intaddData(inta,intb); ~MyTestDLL(); };
#define_DLL_EXPORTS #includeMyTestDLL::~MyTestDLL(){ std::cout<"destory?instance?done!"?< 編譯運行成功,顯示如下:
02DLL測試程序
創建測試程序,來測試DLL。新建一個控制臺空項目,在源文件中添加main.cpp文件,然后添加如下代碼:
#include"opencv2/opencv.hpp" #include"mytest.h" intmain(intargc,char**argv){ std::cout<"test?mydll..."?<mydll(newMyTestDLL()); intsum=mydll->addData(3,5); std::cout<"DLL?invoke?result?:?"?< 運行結果如下:
YOLOv8對象檢測DLL測試
采用相同的方法,基于ONNXRUNTIME深度學習模型庫框架, 我對以前ONNXRUNTIME + YOLOv8對象檢測C++代碼稍作修改,封裝了一個YOLOv8對象檢測推理類為DLL,支持C++與C#接口調用。客戶端調用代碼如下:
#include"yolov8_infer.h" #include#include std::stringlabel_map="D:/python/yolov5-7.0/classes.txt"; intmain(intargc,char**argv){ std::stringnames="10:bike"; intpos=names.find_first_of(":"); std::cout<>"<classNames; std::ifstreamfp(label_map); std::stringname; while(!fp.eof()){ getline(fp,name); if(name.length()){ classNames.push_back(name); } } fp.close(); //std::shared_ptr detector(newYOLOv5ORTDetector()); std::shared_ptr detector(newYOLOv8ORTDetector()); detector->initConfig("D:/python/my_yolov8_train_demo/yolov8n.onnx",640,640,0.25f,0.5); cv::VideoCapturecapture("D:/images/video/sample.mp4"); cv::Matframe; std::vector results; while(true){ boolret=capture.read(frame); if(frame.empty()){ break; } int64start=cv::getTickCount(); detector->detect(frame,results); floatfps=static_cast (cv::getTickFrequency())/(cv::getTickCount()-start); cv::putText(frame,cv::format("FPS:%.2f",fps),cv::Point(50,50),cv::FONT_HERSHEY_SIMPLEX,1.0,cv::Scalar(255,0,255),2,8); for(DetectResultdr:results){ cv::Rectbox=dr.box; cv::putText(frame,classNames[dr.classId],cv::Point(box.tl().x,box.tl().y-10),cv::FONT_HERSHEY_SIMPLEX,.5,cv::Scalar(0,0,0)); } cv::imshow("YOLOv8+ONNXRUNTIME-DLL導出演示",frame); charc=cv::waitKey(1); if(c==27){//ESC退出 break; } //resetfornextframe results.clear(); } return0; } 審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
dll
+關注
關注
0文章
120瀏覽量
46838 -
接口
+關注
關注
33文章
9519瀏覽量
157014 -
封裝
+關注
關注
128文章
9248瀏覽量
148606 -
C++
+關注
關注
22文章
2123瀏覽量
77110 -
動態鏈接庫
+關注
關注
0文章
11瀏覽量
7223
原文標題:手把手教你 封裝DLL類 給客戶端調用
文章出處:【微信號:CVSCHOOL,微信公眾號:OpenCV學堂】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
熱點推薦
LabVIEW中DLL文件的創建過程和編程結果
,并給出了編程結果。本文提供的程序創建方法可推廣應用于其他DLL文件的開發。關鍵詞:動態鏈接庫; LabVIEW; 自動測量; 儀器控制 Building and Applicatio
發表于 05-15 07:24
怎么為dll創建頭文件?
>或者,我可以導入沒有標題的DLL嗎?除非它是VEE識別的組件庫。>是否有可能為奇怪的DLL創建一個>頭文件,我不知道?你可以用dumpbin或depends來輕松獲得函數名。參數列表
發表于 10-21 15:48
comres.dll下載 (comres.dll文件病毒)
描述:comres.dll是系統的動態鏈接庫文件。 文件路徑: C:WINDOWSsystem32comres.dll 備份文件路徑
發表于 11-28 14:12
?113次下載
usp10.dll下載 (usp10.dll文件)
usp10.dll是什么?usp10.dll是字符顯示腳本應用程序接口相關文件。如果出現"沒有找到usp10.dll"
發表于 11-28 15:04
?238次下載
Arduino板是什么如何使用IDE軟件創建和上傳Arduino程序到Arduino板
本章我們將研究Arduino板和IDE軟件,我們要用IDE軟件創建和上傳Arduino程序到Arduino板(Arduino用草圖表示程序,我們還是繼續用程序這個傳統術語)。我們會學到
發表于 05-14 18:11
?4次下載
FreeRTOS任務如何創建和刪除?
在FreeRTOS移植到Cortex-M3硬件平臺的文章中,我們已經見過任務創建API,但那篇文章的重點在于如何移植FreeRTOS,本文將重點放在任務的創建和刪除API函數上面。 任務創建和刪除
DLL文件的創建和測試程序



評論