解決VS中Debug與Release版本切換的問題
最近在使用PCL以及VTK等開發庫,但是使用過程中總會出現Debug與Release版本之間切換的問題,完全按照網上各種大牛的教程來配置的開發環境,為啥會爆出各種錯誤呢,一開始我也是一頭霧水,明明在Debug或者Release模式下執行的好好地,可是切換模式後奇怪的錯誤接踵而至,而且我可能會使用到多種開發庫來開發同一個專案,很多情況下配置完後發現程式根本不能執行,找來找去也沒有發現在幾到底錯在哪裡,直到後來才發現就是在編譯程式的時候lib檔案在做怪。那麼lib檔案是如何作怪的呢?
本文中以OpenCV2.4.9的配置來舉例,我們都知道按照網上的教程在配置OpenCV的時候都會有一步就是在工程的聯結器-》輸入中新增OpenCV的所有lib檔案,然而lib檔案分為兩種,一種是帶字母d的debug版本,另一種是不帶字母d的release版本,一般教程都會要求我們將所有lib檔案全部新增進去,如下圖所示:
由於把debug版本的(帶d的)lib檔案放在了前面,所以後面的release版本lib檔案從來都不會起到任何作用,所以程式智慧執行debug模式,在release模式下不能執行,同理將release版本lib檔案放在前面,debug的lib檔案就不會起作用,就只能執行release模式,而不能執行debug模式。那麼如果我們想要一勞永逸的來解決這個問題,隨時在Debug與Release版本之間切換,而不用這麼麻煩頻繁的修改聯結器-》輸入中的lib名稱,該如何做呢?
最好的方法就是自己寫一個檔案來手動的編譯這些lib檔案。
建一個檔案opencv_lib.h
檔案內容如下:
#ifndef _OPENCV_LIB_ #define _OPENCV_LIB_ #ifdef _DEBUG #pragma comment(lib, "opencv_calib3d249d.lib") #pragma comment(lib, "opencv_contrib249d.lib") #pragma comment(lib, "opencv_core249d.lib") #pragma comment(lib, "opencv_features2d249d.lib") #pragma comment(lib, "opencv_flann249d.lib") #pragma comment(lib, "opencv_gpu249d.lib") #pragma comment(lib, "opencv_highgui249d.lib") #pragma comment(lib, "opencv_imgproc249d.lib") #pragma comment(lib, "opencv_legacy249d.lib") #pragma comment(lib, "opencv_ml249d.lib") #pragma comment(lib, "opencv_nonfree249d.lib") #pragma comment(lib, "opencv_objdetect249d.lib") #pragma comment(lib, "opencv_ocl249d.lib") #pragma comment(lib, "opencv_photo249d.lib") #pragma comment(lib, "opencv_stitching249d.lib") #pragma comment(lib, "opencv_superres249d.lib") #pragma comment(lib, "opencv_ts249d.lib") #pragma comment(lib, "opencv_video249d.lib") #pragma comment(lib, "opencv_videostab249d.lib") #else #pragma comment(lib, "opencv_calib3d249.lib") #pragma comment(lib, "opencv_contrib249.lib") #pragma comment(lib, "opencv_core249.lib") #pragma comment(lib, "opencv_features2d249.lib") #pragma comment(lib, "opencv_flann249.lib") #pragma comment(lib, "opencv_gpu249.lib") #pragma comment(lib, "opencv_highgui249.lib") #pragma comment(lib, "opencv_imgproc249.lib") #pragma comment(lib, "opencv_legacy249.lib") #pragma comment(lib, "opencv_ml249.lib") #pragma comment(lib, "opencv_nonfree249.lib") #pragma comment(lib, "opencv_objdetect249.lib") #pragma comment(lib, "opencv_ocl249.lib") #pragma comment(lib, "opencv_photo249.lib") #pragma comment(lib, "opencv_stitching249.lib") #pragma comment(lib, "opencv_superres249.lib") #pragma comment(lib, "opencv_ts249.lib") #pragma comment(lib, "opencv_video249.lib") #pragma comment(lib, "opencv_videostab249.lib") #endif #endif
把這個檔案放在OpenCV安裝目錄的include目錄下,這樣每次在寫OpenCV工程的時候就新增上標頭檔案#include<opencv_lib.h>就Ok啦。如果想要偷懶,不妨將這句話寫入到opencv.hpp檔案中,每次工程標頭檔案只需要包含#include<opencv2/opencv.hpp>就全部搞定,連其他標頭檔案也都不用寫了,因為opencv.hpp檔案中基本上包含了opencv所有的標頭檔案。
但是請注意,如果要這樣做,一定要記得不能再聯結器-》輸入中新增任何opencv2.4.9的debug或者release版本的lib,這樣做會是的前面的工作都全部失效。(就只需要修改這一個地方,其他的opencv配置完全不做任何變化哦)
通過上述方法,就可以在在Debug與Release版本之前切換自如,而不抱任何錯誤啦!其他類似的開發庫配置與此類似。