1. 程式人生 > >OPENCV脫離庫的靜態連結方法

OPENCV脫離庫的靜態連結方法

 由於OpenCV自2.3.0版本開始就提供了OpenCV-2.3.x -win-superpack.exe或OpenCV-2.4.x.exe檔案,該檔案解壓後我們會發裡面有個名為“build”的資料夾,其中有各個平臺的連結庫,而且還提供了Windows平臺下的靜態連結庫
本篇文章來源於 Linux公社網站(www.linuxidc.com)  原文連結:http://www.linuxidc.com/Linux/2012-08/68301.htm。

要給老師整理做過的演算法各種脫離OPENCV庫的可執行檔案,就又折騰起了靜態連結問題 ,現在來說說如果想要你的程式在一臺裸奔的電腦上執行,需要怎麼辦。

以OPENCV2.4.3+VS2010

第一種方法是粗暴的什麼都不改變然後將有可能用到的DLL都拷貝到資料夾中,這時候如需要opencv_highgui243.lib,是來自 opencv\build\x86\vc10\lib,以前使用這種方法,帶需要拷貝的DLL太多,比較麻煩。

第二種方法是採用OPENCV的靜態連結庫,我覺得很神奇,搜尋了一下,大家都在自己編譯靜態連結庫,但是其實OPENCV自己已經編譯好了靜態連結庫,就在 opencv\build\x86\vc10\staticlib中,只是和LIB中的opencv_highgui243.lib等名字相同,所以如果你並沒有修改過OPENCV的原始碼通過以下幾步快速配置靜態庫:

以RELEASE為例

(1)在Linker選項->General->Additional Library Directories選擇<Edit…>,刪去原來的“$(OpenCV2_4_3_Dir)\ lib”,然後在編輯框中輸入“$(OpenCV2_4_3_Dir)\ staticlib”後確定(這裡OpenCV2_4_3_Dir是環境變數是你安裝OPENCV的路徑,比如我的是D:\Study\OpenCV2.4.3\build_vc10)。

(2)在Linker選項->Input->Additional Dependencies選擇<Edit…>,然後在編輯框中輸入一下內容後確定:

vfw32.lib

comctl32.lib

zlibd.lib

libjasperd.lib

libjpegd.lib

libpngd.lib

libtiffd.lib

IlmImfd.lib

opencv_core243d.lib

opencv_imgproc243d.lib

opencv_highgui243d.lib

opencv_ml243d.lib

opencv_video243d.lib

opencv_features2d243d.lib

opencv_calib3d243d.lib

opencv_objdetect243d.lib

opencv_contrib243d.lib

opencv_legacy243d.lib

opencv_flann243d.lib

(3)專案屬性面板下-C/C++ /程式碼生成-/若是RELEASE選擇MT,若是DEBUG選擇MTD,然後編譯生成即可。

opencv靜態編譯

原來寫的那篇文章實在過於簡陋,而且日子一長,本人也沒有再編譯成功過。今天有兄弟相求,我便再次研究了一遍。現將結果再作一下總結。

OpenCV現在的版本是1.0,已經很長時間沒有更新了,不知道下個版本什麼時候放出。其實,OpenCV的.dll檔案並不多,如果想脫離這些.dll,使用靜態庫的話,那麼一個小小的程式也差不多近2MB了。不過為了演示及釋出方便,編譯為靜態庫也算是一種需要吧。

想編譯成靜態庫,就需要了解一個知識:執行庫(Runtime Library)。執行庫是最基本的庫,配合C++的語法及作業系統實現了一些基本的功能,如記憶體操作(new/delete等)等。可以說執行庫是任何程式,庫的基礎。在VC(2005以上)中有四種執行庫:Multi-threaded、Multi-threaded-Debug、Multi-threaded-dll、Multi-threaded-debug-dll:前兩個為一組,是靜態型別庫,提供的函式會被連結到最後的程式中,其中兩者的區別就在於一個帶些除錯用的資訊及檢查程式碼;後兩個為一組,是動態庫,最後會以動態連結庫的形式(如在VC2008中為MSVCR90.dll或MSVCR90D.dll),提供函式給程式呼叫。當編譯專案的時候,以上四種執行庫,只能選擇其中一種;若專案還引用了其它庫,那麼被引用的庫應該與這個專案使用同樣的執行庫。否則,或者連結不能通過,或者是出現連結警告。試想,如果同時選擇了Multi-threaded、Multi-threaded-Debug,那麼就有兩種new的實現方法,連結器應該選擇誰呢?(其實,也並不是不能組合兩種執行庫如一個用msvcr90.dll的a.dll和使用此a.dll的.exe程式,只不過兩種執行庫不能連結到同一程式中.)所以,想要地釋出能獨立執行的OpenCV程式,就需要讓程式引用的各個庫都統一的為Multi-threaded或Multi-threaded-debug。

OpenCV 1.0 for Windows安裝好後,在bin目錄下,有已經編譯好的Multi-threaded-dll版本的.dll庫,但這不是獨立程式所需。以下要說明的是如何使用Multi-threaded執行庫的方法。在_make目錄裡,開啟opencv.sln。專案中有cv、cvaux、cvinfo、cvspamle、cvtest、cxcore、cxcoretest、cxts、highgui、ml等共10個小工程,其中cv、cvaux、cxcore、cxts、highgui、ml等6個工程為需要編譯的庫。首先,要解決程式碼上的一個bug:開啟cvaux工程的cvaux.h檔案,仔細看1137行,註釋的後半部分打錯成?號了,改回來。接著,切換到Release版,同時選中6個工程,然後更改屬性:A.在General下,改Output Directory,這是改變庫的輸出路徑;B.同General下,改Configuration Type為Static Library (.lib)。這表示要生成靜態庫;C.在/C++/Code Generation下,選擇Multi-Threaded,這是我們需要的執行庫。這樣,便能生成需要的靜態庫了。(之前寫的文章說highgui還需要特別設定,那是多餘的)

以上過程只是完成了非常簡單的一部分,我們還需要開啟otherlibs/_graphics/src目錄下的graphic_lib.sln專案,做同樣的更改,編譯出Multi-Threaded的靜態庫(預設的為Multi-Theaded Dll的庫)。但是,libjasper.lib這個庫沒有原始碼,得從網上下載後,編譯為相應的版本。這樣,準備工作算是完成了。

要生成獨立的程式,還需要設定。可以拿cvsample來測試。同樣在Release版下,首先,C++/Code Generation要改為Multi-Threaded。其次,Linker/General下,Additional Library Directories要新增上剛才這些靜態庫的的路徑如otherlibs/_graphics/lib。最後,在Linker/Input中,Additional Dependencies裡,新增先前生成的靜態庫名字cxcore.lib cv.lib highgui.lib libjpeg.lib libpng.lib libtiff.lib libjaspermt.lib zlib.lib comctl32.lib。(注意comctl32.lib也需要添上)。編譯後,用Depends軟體,看生成的cvsample.exe是否只包含系統裡一些基本的.dll檔案。如果是這樣,那表明已經成功了。注意看是否有連結錯誤,有的話,說明cvsample所依賴的庫裡,有非Multi-threaded版本的執行庫。

小結一下,生成這些靜態庫和生成獨立執行的OpenCV程式還是比較麻煩的,關鍵在設定好執行庫版本。libjasper.lib在OpenCV的安裝包裡只有Multi-Threaded-Dll版本,而且不帶原始碼,這就是說,預設的OpenCV1.0是不能以靜態方式連結到程式中去的。


相關推薦

OPENCV脫離靜態連結方法

 由於OpenCV自2.3.0版本開始就提供了OpenCV-2.3.x -win-superpack.exe或OpenCV-2.4.x.exe檔案,該檔案解壓後我們會發裡面有個名為“build”的資料夾,其中有各個平臺的連結庫,而且還提供了Windows平臺下的靜態連結庫

opencv脫離動態靜態連結方法

        要給老師整理做過的演算法各種脫離OPENCV庫的可執行檔案,就又折騰起了靜態連結問題 ,現在來說說如果想要你的程式在一臺裸奔的電腦上執行,需要怎麼辦。         以OPENCV2.4.3+VS2010         第一種方法是粗暴的什麼都不改

C語言使用動態連結靜態連結

1.C語言中的連結器 (1)每個 C 語言原始檔被編譯後生成目標檔案,這些目標檔案最終要被連結在一起生成可執行檔案。  (2)連結器的主要作用是把各個模組之間相互引用的部分處理好,使得各個模組之間能夠正確的銜接。  2.靜態連結 由連結器在連結時將庫的內容直

靜態連結、動態連結使用方法

 總結一下動態連結庫和靜態連結庫。 首先搞清楚幾個概念: 靜態庫:函式和資料被編譯進一個二進位制檔案,通常副檔名為.lib。在使用靜態庫的情況下,在編譯連線可執行檔案時,連結器從庫中複製這些函式和資料並把它們和應用程式的其他模組組合起來建立最終的可執行檔案(.exe檔案)。

VS2013建立opencv-2.4.10靜態連結

如何在VS2013下配置OpenCV  VS2013+opencv2.4.10配置   vs2013配置opencv     VS2013怎麼配置opencv才能不用每次都重新配置一遍 我們平時在VS2013上借用opencv的函式時,很多時候都是以動態連結的方

VS2012中使用OpenCV-3.0.0的動態連結靜態連結

一、 新建工程 1、選單選擇“檔案——新建——專案” 2、左側選擇“已安裝——模板——Visual C++——Win32”,右側選擇“Win32專案” 3、確定後,依次點選“下一步”, 4、點選“完成”,自動生成專案

GCC 編譯使用動態連結靜態連結方法

1 庫的分類 根據連結時期的不同,庫又有靜態庫和動態庫之分。 靜態庫是在連結階段被連結的(好像是廢話,但事實就是這樣),所以生成的可執行檔案就不受庫的影響了,即使庫被刪除了,程式依然可以成功執行。 有別於靜態庫,動態庫的連結是在程式執行的時候被連結的。所以,即使程式

android studio 利用gradle和cmakelist生成c++靜態.a的方法總結

nts 需求 roi ++ build mat 頭文件 方法 ext android生成靜態庫的方法有兩種,一種是編輯android.mk文件,一種是編輯cmakelist文件。前一種沒做研究,因為用的ide是android studio,所以直接利用gradle調用cma

Windows系統下靜態和動態的使用方法

系統 comment 入庫 自己 動態庫 lib windows系統 window ont 使用靜態庫時,我們需要別人提供的頭文件和lib文件,然後在自己的工程的源文件(.cpp文件)中添加頭文件和#pragma comment(lib, "靜態庫的路徑") 使用動態庫時

Windows系統下靜態和動態的生成方法

fine end def imp XP fin windows 靜態 style 靜態庫的生成方法:直接創建靜態庫項目,寫好功能後,編譯生成即可,把頭文件和靜態庫提供給別人即可使用 動態庫的生成方法:創建動態庫項目,在頭文件中寫入: #ifdef DLLEXPORT #de

(轉)靜態編譯,動態編譯,靜態連結,動態連結

1.定義 LIB檔案中包含函式程式碼本身,在編譯時直接將程式碼加入程式當中。稱為靜態連結庫static link library。 LIB包含了函式所在的DLL檔案和檔案中函式位置的資訊(入口),程式碼由執行時載入在程序空間中的DLL提供,稱為動態連結庫dynamic link libr

C語言函式:動態連結靜態連結

首先,函式庫就是一些事先寫好的函式的集合,是別人分享的,我們可以拿來使用的。經過一些校準和整理,就形成一份標準化的函式庫。例如glibc 函式庫有兩種提供形式:動態連結庫與靜態連結庫 早起函式庫裡的函式都是直接共享的,就是所謂的開源社群。後來函式庫商業化,就出現了靜態連結庫與動態連結庫。

靜態連結的編譯與使用 linux下的動態連結靜態連結到底是個什麼鬼?(一)靜態連結的編譯與使用

linux下的動態連結庫和靜態連結庫到底是個什麼鬼?(一)靜態連結庫的編譯與使用       知識不等於技術,這句話真的是越工作的時間長越深有體會,學習到的知識只有不斷的實踐,才成真正在自已的心裡紮下根,成為自身的一部分,所以無論如何,我希望我的部落格可以

連結裝載與 第4章 靜態連結

靜態連結 /* a.c */ extern int shared; int main() { int a = 100; swap( &a, &shared); } /* b.c */ int shared = 1; void swap(int* a, i

Linux下動態(.so)和靜態(.a) 的區別 Linux下動態(.so)和靜態(.a) 的區別 動態(.so)連結靜態(.a)的情況總結

Linux下動態庫(.so)和靜態庫(.a) 的區別   靜態庫在程式編譯時會被連線到目的碼中,程式執行時將不再需要該靜態庫。編譯之後程式檔案大,但載入快,隔離性也好。 動態庫在程式編譯時並不會被連線到目的碼中,而是在程式執行是才被載入,因此在程式執行時還需要動態庫存在。多個

Linux:基礎IO(檔案描述符分配規則)(重定向)(inode)(軟硬連結)(動態靜態

目錄 檔案描述符的分配規則 重定向原理 FILE 總結 理解檔案系統 inode是什麼 inode內容 硬連結 軟連結 軟硬連結區別: 動態庫和靜態庫 如何生成自己的動態庫和靜態庫 如何連結一個庫生成可執行程式 檔案描述符的分配規則 最

關於原始檔,標頭檔案,靜態連結檔案,動態連結檔案的的理解

先從原始檔和標頭檔案的關係說起,由於是還是初學階段,只接觸了C++語言和windows平臺下的程式設計,所以只講這兩方面的東東, 標頭檔案的作用:對函式,變數,和類的宣告,其實在標頭檔案也可對一些特殊函式和變數定義,比如可以在標頭檔案中對行內函數和const型別變數定義,由於對類的宣告

GCC編譯過程與動態連結靜態連結(未整理)

來源:https://www.cnblogs.com/qingjiaowoxiaoxioashou/p/6410588.html 根據連結時期的不同,庫又有靜態庫和動態庫之分。靜態庫是在連結階段被連結的,所以生成的可執行檔案就不受庫的影響,即使庫被刪除,程式依然可以成功執行。而動態庫是在程式執行的時

靜態連結(LIB)和動態連結(DLL),DLL的靜態載入和動態載入,兩種LIB檔案。

靜態連結庫(LIB)和動態連結庫(DLL),DLL的靜態載入和動態載入,兩種LIB檔案。 一、 靜態連結庫(LIB,也簡稱“靜態庫”)與動態連結庫(DLL,也簡稱“動態庫”)的區別 靜態連結庫與動態連結庫都是共享程式碼的方式,如果採用靜態連結庫,則無論你願不願意,lib 中的指令都全部被直接包含在最

動態連結靜態連結的優缺點

轉載參考博文 1、靜態連結庫的優點: (1) 程式碼裝載速度快,執行速度略比動態連結庫快; (2) 只需保證在開發者的計算機中有正確的.LIB檔案,在以二進位制形式釋出程式時不需考慮在使用者的計算機上.LIB檔案是否存在及版本問題,可避免dll地獄等問題。 2 、動態連結庫的優點 (