關於MNN工程框架編譯出來的靜態庫和動態庫的使用

笑眯眯办大事發表於2024-08-19

一、MNN.lib檔案路徑

如果你看過之前的部落格內容,應該可以在編譯的的工程當中

C:\Users\Administrator\Desktop\MNN\MNN-master\MNN-CPU-OPENCL\lib\x64\lib\x64

該路徑下面找到debug和release兩個資料夾。
進入到release資料夾下面有Dynamic和Static兩個資料夾,分別代表編譯出來的靜態庫和動態庫內容。這裡先講述靜態庫的使用。
進入Static資料夾,下面有MD和MT兩個子資料夾,分別的含義:

  • MT (Multi-Threaded)
    靜態執行時庫:MT 表示多執行緒靜態執行時庫。這種配置會將 C++ 執行時庫(如 libcmt.lib)靜態連結到你的可執行檔案中。這意味著所有的執行時庫程式碼都被包含在生成的可執行檔案或靜態庫(.lib 檔案)中,生成的檔案會比較大,但在不同的應用程式或庫之間不會共享執行時庫。這個方式不依賴於外部的 DLL 檔案。

  • MD (Multi-Threaded DLL)
    動態執行時庫:MD 表示多執行緒動態執行時庫(DLL)。這種配置會將 C++ 執行時庫的動態連結庫(如 msvcrt.lib)連結到你的程式中。生成的可執行檔案會依賴外部的執行時庫 DLL 檔案,如 MSVCR120.dll。相較於靜態連結,動態連結的優勢是多個應用程式可以共享同一個 DLL 檔案,因此減少了總的記憶體佔用,但這也意味著你必須確保系統中存在正確的執行時庫版本。

二、靜態庫的使用

這裡選擇MT,將其中編譯得到的.lib檔案複製出來,移動到新的工程目錄下面.最終工程目錄如下:

點選檢視程式碼
D:.
├─ConsoleApplication1
│ ├─ConsoleA.e1228ae8
│ │ └─x64
│ │ └─Debug
│ │ └─ConsoleA.e1228ae8.tlog
│ └─x64
│ └─Debug
├─include
│ ├─cv
│ │ └─imgproc
│ ├─MNN
│ │ ├─expr
│ │ └─plugin
│ └─stb
│ ├─.github
│ │ ├─ISSUE_TEMPLATE
│ │ └─workflows
│ ├─data
│ │ └─herringbone
│ ├─deprecated
│ ├─docs
│ ├─stb_image_resize_test
│ ├─tests
│ │ ├─caveview
│ │ │ └─win32
│ │ ├─oversample
│ │ ├─pbm
│ │ ├─pg_test
│ │ ├─pngsuite
│ │ │ ├─16bit
│ │ │ ├─corrupt
│ │ │ ├─iphone
│ │ │ ├─primary
│ │ │ ├─primary_check
│ │ │ └─unused
│ │ ├─prerelease
│ │ ├─sdf
│ │ └─vorbseek
│ └─tools
│ └─unicode
└─lib
這裡可以看到我將需要的標頭檔案包含到了include資料夾下面,將靜態庫包含到了lib資料夾下面,此時開啟visual studio工程當中的powershell資料夾,執行指令
cl /I"D:\System-default\DeskTop\ConsoleApplication1\include" ConsoleApplication1.cpp /link /LIBPATH:"D:\System-default\DeskTop\ConsoleApplication1\lib" MNN.lib

命令解釋

cl 是 Visual Studio 的 C/C++ 編譯器。
/I"D:\System-default\DeskTop\ConsoleApplication1\include" 指定了包含路徑,也就是你的標頭檔案所在的目錄。
ConsoleApplication1.cpp 是你的原始檔。
/link 指定連結選項,後面跟隨 /LIBPATH:"D:\System-default\DeskTop\ConsoleApplication1\lib",指定庫檔案的路徑。
MNN.lib 是你要連結的靜態庫檔案。

注意!!!!
這裡的編譯工具鏈需要指定使用visual studio的工具鏈,而不能使用MinGW的工具鏈,因為lib檔案是使用visual studio工具編譯出來的

Visual Studio 生成的 .lib 檔案是 COFF 格式(Common Object File Format),專門用於 Windows 平臺,並且它們的連結方式依賴於 Microsoft 的連結器。
MinGW 使用的 .a 檔案(或 .lib 檔案,如果是靜態庫)則是基於 GNU 工具鏈,格式和 Visual Studio 不同,不能直接互換使用。

這樣就可以不需要MNN框架而透過利用MNN編譯的靜態庫

三、動態庫的使用

相關文章