目前的項目依賴於很多第三方庫,每次要再一個新的環境編譯/運行,都要花很長時間先編譯/安裝各種第三方庫,而且會出現各種問題,因此決定將所有第三方庫編譯好之後,放入工程的子目錄中,以後就不用重複編譯了。
目錄結構
整理後的目錄結構如下:
一些設定
如此修改目錄結構之後,VS工程的一些設定需要進行修改,分別說明一下:
輸出檔案的路徑
在工程屬性中 Configuration Properties > General > Output Directory 指定的是編譯出來的lib/dll/exe存放的路徑。
因為需要分平台,分Debug/Release版,所以用到了一些宏:
$(SolutionDir)表示solution所在的目錄,在這裡就是src
$(Platform)是當前編譯的平台,win32/x64
$(Configuration)是當前編譯的版本,Debug/Release
修改標頭檔和庫檔案的包含目錄
相應修改一下就行,使用$(Platform)$(Configuration)這兩個宏,可以使各個平台/版本的配置都一樣,不需要分開配置。
具體想知道有哪些可以使用的宏,可以再任何一個edit視窗,點擊“Macro>>”按鈕,展開所有的宏查看。
指定dll所在目錄
最後這一條比較重要,因為現在所有第三方庫都不用安裝了,所以在運行程式的時候如何找到這些dll是一個問題。
exe在啟動並執行時候找dll的順序如下,理論上把dll加到任何一個環節都可以:
應用程式所在目錄;
系統目錄。GetSystemDirectory返回的目錄,通常是系統硬碟WindowsSystem32;
16位系統目錄。該項只是為了向前相容的處理,可以不考慮;
Windows目錄。GetWindowsDirectory返回的目錄,通常是系統硬碟Windows;
目前的目錄。GetCurrentDirectory返回的目錄;
環境變數PATH中所有目錄。
我們之前做了這麼多事情,就是為了在新的環境中不需要做任何配置就能運行VS的工程,所以任何手動拷檔案/修改環境變數的方式都不是最好的。
參考了這篇文章 http://my.oschina.net/u/243648/blog/62847,因為我們的dll分散在很多個檔案夾中,最後採取的方法是將這些目錄都加到環境變數PATH中,當然不是手動添加,而是加到VS的配置中。
在工程屬性中 Configuration Properties > Debugging > Environment 可以添加在VS中運行程式需要添加的一些環境變數,僅對當前工程有效。我們把所有第三方庫的路徑加進去就行了,注意一定要用相對路徑,否則換一台機器還是不能用。這裡有個潛在的危險,如果你的系統裡面已經裝了這個第三方庫,並且加到了上面6個環節中的任意一個,可能會引起一些錯誤。
另外如果出build的話,就需要另寫一個指令碼,將需要用到的第三方dll和編譯出來的程式一起打包,這樣就行了。