How to build C++/CLI target to .net 2.0 without vs2008


摘要

本文介紹如何在沒有vs2008的情況下,將C++/CLI程序編譯成.net 2.0版本

本文首發與我的個人博客:How to build C++/CLI target to .net 2.0 without vs2008

自從vs2010開始,vs調整了對C++編譯的策略,使用MSBuild模式,該模式對於將早期的vs2008開發的項目遷移至vs2010是有利的,但是如果用戶沒有vs2008,但有vs2010,卻不能將C++/CLI項目編譯成.net 2.0,只能是4.0。查遍網上的解決方案,幾乎一致的方案是安裝vs2008(3G+)。本文針對這個問題,給出一個不安裝vs2008的綠色環保方案(大約200多M)。拯救我們的硬盤空間吧!

 

緣起

項目基於C++/CLI封裝了BMC Remedy C API,最初我的開發環境是VS2010和VS2012(自從用了VS2012后,我發現其對C++的支持可謂空前的優秀),編譯的托管dll是基於.net 4.0的,本來以為只要不用2.0以上的特性,可以輕松的將目標平台降到2.0,但是當我將Project文件中的targetframework設置為2.0后,本以為“巧妙的”解決了問題了。但是當編譯基於2.0的C#項目時(該項目引用了這個C++/CLI項目),報錯為“2.0項目不能引用高版本的4.0”。不是明明設置成2.0了嗎?后來用ILSpy查看,的確編譯出來的C++/CLI的dll是基於4.0的。怎么回事呢?經過反復的查詢,必須安裝vs2008才能編譯出.net 2.0的C++/CLI程序集。我的天哪,要知道我已經安裝有vs2010和vs2012了,硬盤實在不能承受啊,無奈之下只能先在其他機器上安裝vs2008了。當然問題最后的確是解決了,但是作為一個正兒八經的項目不能這么就結束了,於是便有了本文的探討。

 

各取所需

對於僅僅需要編譯C++而安裝vs2008實在是不划算。仔細想來,vs2008是個集成開發環境,編譯普通的C++程序大約只需要C++編譯和鏈接器、動態和靜態鏈接庫、導入庫即可,而對於MFC、ATL等也只是在這個基礎上增加了更多的庫而已。對於C++/CLI程序的編譯大約增加了.net framework。還記得每個版本的visual studio都提供一個命令行工具嗎?該工具會幫我們設置各種環境變量,在這個命令行中可以手動執行各種編譯動作。想到這里,是否能夠將vs2008中的C++編譯所需要的工具和庫文件從vs2008中提取出來,再加上一個命令行工具,就可以在沒有vs2008的情況下編譯我們的dll了,這樣一個綠色的編譯環境會完成了啊~相信最終的大小會小很多啊。

找到vs2008的VC目錄,大致如下:

image

主要的目錄如上圖:

  • atlmfc:開發基於alt、mfc等所需要的頭文件和導入庫,可以不要
  • bin:vc的工具集,其中包含編譯器、鏈接器、nmake等,當然要拉
  • crt:大概是vc運行時的源代碼,可以不要
  • include:vc的頭文件,當然要拉
  • lib:vc導入庫,當然要拉
  • redist:crt運行時的動態連接庫,建議帶上,因為部署的時候需要

將上述需要的內容copy出來留用。另外,既然是windows編程,當然需要windows的導入庫和頭文件,來到Microsoft SDKs目錄,找到6.0版本的SDK,其中的include和lib目錄就是所需要的,偷出來吧!

 

繼續瘦身

是不是發現怎么沒有想象的那么小啊~。別急我們繼續來瘦身,發現不管是vc的導入庫還是windows的導入庫都很大,其實原因就是每個導入庫都對應不同的CPU架構有多個版本,並且除了x86之外,其余的導入庫都單獨放在獨立的文件夾中,根據你的需要去掉其中不要的就好了。現在是不是大大縮小了。

別急,還有空間,看看bin下面,其中也有非x86的工具集,如果你在x86下工作,大可刪掉其中其他平台的文件夾

還有還有,redist文件夾下面也包含有多個平台的動態連接庫,取你所需即可,另外可以刪掉mfc和atl的動態連接庫。

 

制作命令行工具

上一步得到的200M左右的“編譯環境”,可以發在U盤里面隨身攜帶。不過如何使用呢?我們需要一個命令行工具,這個工具在啟動時,會將我們這個編譯環境相關的路徑設置上,這樣可以不與已經安裝的高版本的vs產生沖突。

首先看下我的編譯環境的目錄結構

image

其中WinSDK6下分別是windows的include和lib,其他都是從上面的步驟中copy過來的,現在我們在制作vsvars32.bat:

@SET VCINSTALLDIR=J:\vs2008vcbuild
@ SET FrameworkDir =C:\Windows\Microsoft.NET\Framework
@ SET FrameworkVersion =v 2. 0. 50727
@ SET Framework35Version =v 3. 5
@ if "%VCINSTALLDIR%" == "" goto error_no_VCINSTALLDIR

@ echo Setting environment for using Microsoft Visual Studio 2008 x 86 tools.


@rem
@rem Root of Visual Studio IDE installed files.
@rem

@ set PATH = %VCINSTALLDIR%\bin;C:\Windows\Microsoft.NET\Framework\v 3. 5;C:\Windows\Microsoft.NET\Framework\v 2. 0. 50727; %PATH%
@ set INCLUDE = %VCINSTALLDIR%\include; %VCINSTALLDIR%\WinSDK 6\Include; %INCLUDE%
@ set LIB = %VCINSTALLDIR%\lib; %VCINSTALLDIR%\WinSDK 6\Lib; %LIB%
@ set LIBPATH =C:\Windows\Microsoft.NET\Framework\v 3. 5;C:\Windows\Microsoft.NET\Framework\v 2. 0. 50727; %VCINSTALLDIR%\lib; %VCINSTALLDIR%\WinSDK 6\Lib; %LIBPATH%

@ goto end

:error_no_VCINSTALLDIR
@ echo ERROR: VCINSTALLDIR variable is not set.
@ goto end

:end

這是適用於x86目標平台的 編譯環境,如果要編譯其他平台,可以類推。

腳本的第一行指向的是你的編譯環境的路徑,如果你像我一樣放在U盤中,並且目錄名叫vs2008vcbuild,那么你可以不用改

 

開始編譯

啟動cmd,執行vsvars32.bat,這樣你的環境變量都設置好拉,然后cd到你source的目錄下,執行相應的命令,為避免有不熟悉命令行模式的朋友,大概普及一下vc的編譯器和鏈接器:

  • cl:vc的編譯器工具,將每個cpp文件,編譯生成對應的obj文件
  • link:vc的鏈接器工具,將obj文件和lib文件鏈接成可執行文件
  • nmake:vc的make工具,能夠根據nmake格式的配置文件自動編譯和鏈接,類似於GNU的make

這些工具都在bin目錄下能夠找到,使用並不是很難,可以參考相關的文檔學習使用,關於c++的編譯原理可以參考我的文章:http://pchou.info/C-Cpp/2013/01/12/net-cpp-hobby-02.html

偷懶的話,可以從vs2008里面把編譯和鏈接的命令行參數copy出來哦~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM