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运行库依赖;

上一篇:AndroidStudio Gradle版本不匹配问题


下一篇:Java 8 开发*技巧