1. 程式人生 > >VS2015+CMake編譯OpenCV2.4.13靜態庫

VS2015+CMake編譯OpenCV2.4.13靜態庫

之前用CMake自己編譯過OpenCV2.4.13的動態庫,現在專案要求要用靜態庫,沒辦法只能重新來一遍。

OpenCV已經提供編譯好的庫了,我們為什麼還要自己編譯?主要還是因為官方提供的版本由於要適配所有人的需求,所以只能是標準版本,可能和你自己需要用的某些庫並不匹配,這個時候就很容易出錯了。而且還有一個很方便的地方就是,自己編譯一次,在除錯的時候是可以追蹤到原始碼的,你如果用官方提供的庫就不行了。

靜態庫和動態庫的編譯過程完全相同,只有在cmake配置的時候有一個小地方不一樣而已,後面會說。好了,開始吧。

工具版本:

VS:Visual Studio Community 2015 中文版

Step 1:CMake 配置

注:CMake在安裝的時候記得勾選“Add cmake into PATH for all users.” 這樣省去後面配置環境變數的麻煩。

第一步:安裝完成後,開啟CMake,最上面的兩個框這樣配置:

Where is the source code: 選擇你的opencv原始碼所在的資料夾,比如我的D:/OpenCV/Sources/opencv2413sources

Where to build the binaries:選擇要存放編譯之後的檔案的資料夾,新建一個比如D:/OpenCV/OpenCV2413/static

第二步:然後點選左下角的Configure按鈕,這個時候會彈出一個框讓你選擇要使用的編譯器版本:

這個地方一定一定一定要選擇正確,否則下面的步驟就沒法進行了,全部都是錯誤。總而言之,你電腦上裝了什麼版本的VS,就用什麼版本,後面帶Win64的是64位的意思,不帶這個的就是32位,我們一般都是生成32位的,所以就選擇Visual Studio 14 2015就行了。如果你這個地方選錯了,會出現下面這樣的錯誤:


出現這種錯誤可能的情況有:

1. 沒搞清楚VS版本的命名方式,沒仔細看選錯了版本。比如Visual Studio 14實際上指的是Visual Studio 2015,而Visual Studio 15指的是Visual Studio 2017,你如果電腦上裝的是VS2015,那要選擇Visual Studio 14 2015這個選項才對。為啥VS兩套命名方式,其實20XX這種是釋出版本的年份,也就是VS的正式版本名稱,而所謂的14,15這種是VS的內部版本號。

2. 所選擇的路徑中包含中文,CMake不識別中文。其實不管是CMake還是其他的也好,最好這種和程式設計相關的東西全部不要用中文,一定一定換成英文,可以省去很多麻煩。

3. 電腦上安裝了其他版本比如64位的CUDA等別的東西,而你要生成的是32位的OpenCV庫,所以這裡配置的時候就出錯了。我在第二次進行編譯的時候就出現了這個錯誤,因為距離第一次使用cmake編譯已經過去了半年多,這期間我因為用深度學習的庫所以安裝了不少東西,比如CUDA,而我電腦是64位的,所以這些都是64位版本,因此在這裡配置的時候就一直提示這個錯誤。如果你也出現這個錯誤,不用擔心,第一次配置完之後出現上面那麼多紅色的東西,找到WITH_CUDA和WITH_CUFFT這個選項,把前面的勾去掉,再第二次點選Configure就不會出錯了。


第三步:好了,如果你上面的步驟都沒有出錯,那麼第一次點選Configure之後就會出現很多很多紅色背景上的選項,由於我們要生成靜態庫,所以要找到其中的BUILD_SHARED_LIBS這個選項,把前面的勾去掉即可。【如果是要生成動態OpenCV庫,那就勾選這個選項】然後再點選一次Configure即可,會看到左下角出現“Configuring done”的提示,這就表示配置沒問題了。

第四步:然後再點選“Generate”按鈕即可。如果成功的話會在左下角看到“Generate done”的提示。

如果到了這一步,就說明CMake的使命已經完成了,你可以關閉CMake了。然後開啟我們剛才指定的那個生成目錄。

Step 2:使用VS2015編譯OpenCV

開啟我們指定的生成目錄可以看到一個叫做OpenCV.sln的檔案:


可以看到這就是VS的解決方案檔案,那個圖示的左上角是14,這代表我們生成的確實是VS2015版本的,雙擊開啟它,可以看到70個左右的專案:


注:一般庫都是分Debug版本和Release版本的,所以你最好也是兩個版本都生成一下,便於不同情況下使用。

首先選擇Debug,然後選擇“生成-->生成解決方案”,耐心等待即可。


當然你完全也可以選擇用F5或者點選右邊的綠色三角來執行,這都是可以的。但是如果用這種方式來執行,在所有的庫生成之後會彈出一個小錯誤:


為什麼?因為ALL_BUILD不是一個可執行的專案啊,而你選擇了用除錯執行的方式來執行編譯,最後要執行,結果ALL_BUILD無法執行,所以提示這個錯誤了。不過你可以完全無視這個錯誤,因為不會有任何一丁點的影響。為了避免出現這個煩人的錯誤,還是建議選擇“生成解決方案”這種方式來執行編譯,我們的目的是生成庫,選擇“生成”不是再自然不過的了麼?

好了,Debug版本的生成之後,切換成Release同樣執行一遍上面的操作,耐心等待生成即可。

等到全部都生成完之後,還有一個步驟一定要做,否則你不知道去哪裡找生成的lib檔案和所有include標頭檔案。

在解決方案管理器裡面看到CMakeTargets下面的ALL_BUILD和INSTALL了嗎?對,選擇INSTALL專案,然後右鍵點選,選擇“生成”:



然後耐心等待一會就行。同樣你需要在Debug下面執行一次,然後切換到Release模式下再執行一次。

這個操作其實是為了把生成的lib(動態庫的話就是dll和lib)和標頭檔案都整合到一起,放在了你剛才開啟OpenCV.sln這個目錄下的install資料夾內:


include裡面就是opencv和opencv2兩個資料夾,是不是很熟悉?

x86裡面就是vc14\bin和vc14\staticlib,是不是很熟悉?

不過我們是要生成靜態庫,所以其實這裡bin目錄下面的東西沒什麼用,我們只需要vc14\staticlib下面的lib庫檔案就行了。


為了使用方便,建議把Debug版本(就是後面帶小寫字母d的那個檔案)和Release版本的庫分開存放在Debug和Release兩個資料夾中。

好了,到此我們需要的OpenCV庫就生成成功了,要使用的話只需要install這一個資料夾內的內容就行了,其他的你嫌煩都可以刪掉了。