Microsoft Visual Studio 開發的C++程序軟件發佈相關事宜

VS2005/VS2008軟件發佈:

  Debug版本:

    非MFC程序:

      編譯選項mdd:

        僅依賴C++庫和C運行時庫,需要到VS2005/VS2008下安裝目錄VC/redist/Debug_NonRedist中,找到Microsoft.VC90.DebugCRT目錄,其中的清單文件*.manifest中內容對應依賴庫文件msvcp90d.dll和msvcr90d.dll;前者爲C++庫,後者爲C運行時庫;此外還有一個msvcm90d.dll庫,項目中一般也會用到;對於清單文件,若VS配置屬性中生產exe未嵌入清單文件(工程屬性下manifest Tool清單工具中Input and Output輸入輸出中可配置是否嵌入exe),則運行時需要單獨提供以上的清單文件和依賴庫庫文件,否則只需要提供相應的依賴庫文件即可;

        若程序依賴第三方動態庫,則還需要提供依賴的第三方庫文件。

        此外還需要目標機器有msvcrtd.dll庫;

      編譯選項mtd:

        不需要依賴C++庫和C運行時庫,因其已靜態連接至exe,也即靜態連接libcmtd.lib(位於VC/lib目錄下);

        此外若程序依賴第三方庫,則還需要提供依賴的第三方庫文件(無論動態庫或靜態庫)(一般情況下建議均選擇同一種編譯選項,不同編譯選項可能導致編譯衝突)。

    MFC程序:

      動態鏈接至MFC庫時:

        除了需要以上非MFC在不同編譯選項外,還需要提供以下對應MFC支持的依賴庫文件;

        到VS2005/VS2008下安裝目錄VC/redist/Debug_NonRedist中,找到Microsoft.VC90.DebugMFC目錄,其中的清單文件*.manifest中內容對應依賴庫文件mfc90d.dll、mfccm90d.dll以及相應的unicode版本依賴庫文件;同樣的對於清單文件,若VS配置屬性中生產exe未嵌入清單文件,則運行時需要單獨提供以上的清單文件和依賴庫庫文件,否則只需要提供相應的依賴庫文件即可;

      靜態鏈接至MFC庫時:

        此時不再需要提供以上的清單文件和依賴庫;只需要以上非MFC在不同編譯選項下情況即可;

  Release版本:

    非MFC程序: 

      編譯選項md:

        僅依賴C++庫和C運行時庫,需要到VS2005/VS2008下安裝目錄VC/redist/x86或amd64中,找到Microsoft.VC90.CRT目錄,其中的清單文件*.manifest中內容對應依賴庫文件msvcp90.dll和msvcr90.dll;前者爲C++庫,後者爲C運行時庫;此外還有一個msvcm90.dll庫,項目中一般也會用到;對於清單文件,若VS配置屬性中生產exe未嵌入清單文件,則運行時需要單獨提供以上的清單文件和依賴庫庫文件,否則只需要提供相應的依賴庫文件即可;

        若程序依賴第三方動態庫,則還需要提供依賴的第三方庫文件。

        此外還需要目標機器有msvcrt.dll庫;

      編譯選項mt:

        不需要依賴C++庫和C運行時庫,因其已靜態連接至exe,也即靜態連接libcmt.lib(位於VC/lib目錄下);

        此外若程序依賴第三方庫,則還需要提供依賴的第三方庫文件(無論動態庫或靜態庫)(一般情況下建議均選擇同一種編譯選項,不同編譯選項可能導致編譯衝突)。

    MFC程序: 

      動態鏈接至MFC庫時:

        除了需要以上非MFC在不同編譯選項外,還需要提供以下對應MFC支持的依賴庫文件;

        到VS2005/VS2008下安裝目錄VC/redist/x86或amd64中,找到Microsoft.VC90.MFC目錄,其中的清單文件*.manifest中內容對應依賴庫文件mfc90.dll、mfccm90.dll以及相應的unicode版本依賴庫文件;同樣的對於清單文件,若VS配置屬性中生產exe未嵌入清單文件,則運行時需要單獨提供以上的清單文件和依賴庫庫文件,否則只需要提供相應的依賴庫文件即可;

      靜態鏈接至MFC庫時:

        此時不再需要提供以上的清單文件和依賴庫;只需要以上非MFC在不同編譯選項下情況即可;

  除了以上的方式外,對於release版本,還可以安裝相應版本的vcredist(一套VC++應用程序需要的組件庫(事實上保護了release下的需要的各個依賴庫而已)),注意vcredist分爲32和64位版本,此外還要注意VS2008和VS2008的sp1時的vcredist版本不一樣的,應根據應用程序的情況安裝對應版本;

  對於某些情況,若在vs2008 sp1下開發時,此時以上的清單文件和依賴庫或者是vcredist需要提供對應版本;

  VS2010以及其後的更高級版本,不再提供清單文件,不過若應用程序依賴了vs2005或VS2008開發的庫或目標文件(obj),則仍然需要清單文件或內嵌exe的清單文件和對應的VS2005或VS2008的運行時依賴庫(含C++/C的運行庫,若爲MFC庫則還需要對應的MFC依賴庫);雖然VS2010以及其後的更高級版本開發的庫或exe可不再提供清單文件,不過仍然依賴對應的運行時庫;

  打包程序時候,無論是debug或者release(一般打包發佈爲release版本)時,可結合“開發工具”分類文章中提到的dependency walker和sxstrace工具查看程序依賴庫或其他依賴的第三方庫或者運行異常時的日誌信息逐步解決依賴問題或是其他的異常問題;此外也可以採用vs提供的安裝和部署工具打包集成net framework運行時庫等(可以很好的處理、打包各個依賴庫或運行時環境)、還可以採用NSIS或其他第三方打包工具;

  簡述:

    若編譯選項爲mt/mtd則不需要提供C++/C的運行時庫依賴;

      若編譯連接靜態庫至MFC;則不需要提供MFC的運行時庫依賴;

    以上前提條件是exe以及其依賴的所有的庫不依賴任何運行時庫的前提下,若有一個依賴,則應用程序將會依賴對應的運行時庫;

    爲了避免編譯衝突,所有開發的庫或依賴庫應統一使用某一個編譯選項CRT運行庫依賴;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章