VS Studio C/C++ 生成release版本可运行exe文件

Published

一个C/C++解决方案中,开发时一般都在Debug环境下.到了最后需要发布,那就要换成Release发布。

C/C++项目有很多特殊的配置,如路径、lib路径、include、预编译头等设置。

这些设置如果在编译的时候被改动过,即不是默认的,那么当你在项目中选择的默认Release配置时,这些设置是不会自动带过来的。

 

一、单个项目设置为Release

参考系统本身的项目的Release原始设置,要真正建立发布版本的属性,共有4个方面10个地方需要修改,包括:
1、代码优化
1.1、常规》》全程序优化:使用链接时间代码生成
1.2、c、c++》》优化:优化:使速度最大化 (/O2)
1.3、c、c++》》优化:启用内部函数:是 (/Oi)
1.4、链接器》》优化:引用:是 (/OPT:REF)
1.5、链接器》》优化:启用comdat折叠:是 (/OPT:ICF)
2、去掉_DEBUG预处理器
在C/C++标签》》预处理器
这个务必去掉,如果不去掉,却使用发布的windll编译(多线程 DLL (/MD) ),会出现大量的错误,如果能编译通过也会出现: File:f:\dd\vctools\crt\crtw32\misc\dbgheap.c 运行时的问题。
即使是你自己的代码没有内存泄露或内存不良操作,也会出现dbgheap错误,为什么会这样呢?
因为我们应用的很多include或lib内部,存在很多_DEBUG代码块,这些代码只供调试追踪使用,是不能确保内存操作安全性的。


3、如果是DLL:C、C++运行库:改为多线程 DLL (/MD) 或根据情况选择其他不带d的
同时代码生成》》基本运行时检查》》也要设置为:默认值,否则会提示一些错误或冲突


4、调试信息开关
最终发布版,你必须去掉所有调试信息输出
c/c++》》常规》》调试信息格式:无
链接器》》调试》》生成调试信息:否

有意思的是:如果你想发布release版本,又想要保留一定程度的跟踪调试环境,你可以这样设置:
c/c++》》常规》》调试信息格式:选择 程序数据库 (/Zi) 
链接器》》调试》》生成调试信息:是 (/DEBUG)

这个release版调试功能非常有用,可以跟踪到语句和方法层面,并有完整的调用堆栈路径,但除了函数参数外,其他变量都无法监控或查看运行时数值,不过对于release版的重点问题追踪完全已经足够了,告诉你问题发生在哪。至于变量看不到,你完全可以增加一些log或printf来查看。

二、多个项目批量设置为Release

如果存在大量的project(比如我的项目存在超过100个project!!),逐个设置仍然很费时,好彩这些都是公共设置,你可以在vs中一次性选择多个项目文件,然后打开属性窗口,进行一次性修改,这样只需要修改一次即可。

 

三、实战项目-配置为Release

vs2019 生成release版本可运行exe文件

一个方案通常由一个主程序项目和多个库文件项目组成。我们需要做的是:

(1)将每个项目配置为Release编译方式:通过“属性-配置管理器”实现。

(2)将每个库项目的DLL输出到主程序项目的BIN目录,供主程序调用:通过“项目属性-选择Release配置-设置输出目录”来实现。

对每个项目单独配置为Release方式

step 1:对项目NetTS的配置为Release方式。

首先,要告诉vs 2019,项目NetTS按Release方式进行编译。具体操作方法:

鼠标右键项目,
1.项目 -> 属性->配置管理器->选择编译方式为Release,win32



step 2:设置项目NetTS的DLL的输出位置

其次,要告诉vs2019项目NetTS按Release编译的情况下,DLL的输出目录。


每个项目要复制相应的DLL文件到相应目录,或者设定DLL目录的位置。

具体方法为:"Properties" -> "Configuration Properties" -> "Debugging",在"Working Directory"设置dll的路径就可以了

这是Debug编译方式下的输出目录

这是Release编译方式下的未修改前的输出目录

 

 

 

Tsking_2019:修改库DLL项目属相为Release

Tsking_2019.sln 

 

 

 @@ -39,32 +39,32 @@ Global
   EndGlobalSection
   GlobalSection(ProjectConfigurationPlatforms) = postSolution
   {9B6D878D-0BEB-42BB-B3E0-8236A8C4B1BA}.Debug|Any CPU.ActiveCfg = Debug|Win32
   {9B6D878D-0BEB-42BB-B3E0-8236A8C4B1BA}.Debug|Win32.ActiveCfg = Debug|Win32
   {9B6D878D-0BEB-42BB-B3E0-8236A8C4B1BA}.Debug|Win32.Build.0 = Debug|Win32
   {9B6D878D-0BEB-42BB-B3E0-8236A8C4B1BA}.Debug|Win32.ActiveCfg = Release|Win32
   {9B6D878D-0BEB-42BB-B3E0-8236A8C4B1BA}.Debug|Win32.Build.0 = Release|Win32
   {9B6D878D-0BEB-42BB-B3E0-8236A8C4B1BA}.Debug|x64.ActiveCfg = Debug|Win32
   {9B6D878D-0BEB-42BB-B3E0-8236A8C4B1BA}.Release|Any CPU.ActiveCfg = Release|Win32
   {9B6D878D-0BEB-42BB-B3E0-8236A8C4B1BA}.Release|Win32.ActiveCfg = Release|Win32
   {9B6D878D-0BEB-42BB-B3E0-8236A8C4B1BA}.Release|Win32.Build.0 = Release|Win32
   {9B6D878D-0BEB-42BB-B3E0-8236A8C4B1BA}.Release|x64.ActiveCfg = Release|Win32
   {A6EA85EB-3835-4C5E-8457-419AC7D865C8}.Debug|Any CPU.ActiveCfg = Debug|Win32
   {A6EA85EB-3835-4C5E-8457-419AC7D865C8}.Debug|Win32.ActiveCfg = Debug|Win32
   {A6EA85EB-3835-4C5E-8457-419AC7D865C8}.Debug|Win32.Build.0 = Debug|Win32
   {A6EA85EB-3835-4C5E-8457-419AC7D865C8}.Debug|Win32.ActiveCfg = Release|Win32
   {A6EA85EB-3835-4C5E-8457-419AC7D865C8}.Debug|Win32.Build.0 = Release|Win32
   {A6EA85EB-3835-4C5E-8457-419AC7D865C8}.Debug|x64.ActiveCfg = Debug|Win32
   {A6EA85EB-3835-4C5E-8457-419AC7D865C8}.Release|Any CPU.ActiveCfg = Release|Win32
   {A6EA85EB-3835-4C5E-8457-419AC7D865C8}.Release|Win32.ActiveCfg = Release|Win32
   {A6EA85EB-3835-4C5E-8457-419AC7D865C8}.Release|Win32.Build.0 = Release|Win32
   {A6EA85EB-3835-4C5E-8457-419AC7D865C8}.Release|x64.ActiveCfg = Release|Win32
   {9D07FF8C-278B-4948-9AE6-E42D6640230C}.Debug|Any CPU.ActiveCfg = Debug|Win32
   {9D07FF8C-278B-4948-9AE6-E42D6640230C}.Debug|Win32.ActiveCfg = Debug|Win32
   {9D07FF8C-278B-4948-9AE6-E42D6640230C}.Debug|Win32.Build.0 = Debug|Win32
   {9D07FF8C-278B-4948-9AE6-E42D6640230C}.Debug|Win32.ActiveCfg = Release|Win32
   {9D07FF8C-278B-4948-9AE6-E42D6640230C}.Debug|Win32.Build.0 = Release|Win32
   {9D07FF8C-278B-4948-9AE6-E42D6640230C}.Debug|x64.ActiveCfg = Debug|Win32
   {9D07FF8C-278B-4948-9AE6-E42D6640230C}.Release|Any CPU.ActiveCfg = Release|Win32
   {9D07FF8C-278B-4948-9AE6-E42D6640230C}.Release|Win32.ActiveCfg = Release|Win32
   {9D07FF8C-278B-4948-9AE6-E42D6640230C}.Release|Win32.Build.0 = Release|Win32
   {9D07FF8C-278B-4948-9AE6-E42D6640230C}.Release|x64.ActiveCfg = Release|Win32
   {ACD6FCF4-0D76-4AFA-947C-1B2A9C4FFF13}.Debug|Any CPU.ActiveCfg = Debug|Win32
   {ACD6FCF4-0D76-4AFA-947C-1B2A9C4FFF13}.Debug|Win32.ActiveCfg = Debug|Win32
   {ACD6FCF4-0D76-4AFA-947C-1B2A9C4FFF13}.Debug|Win32.Build.0 = Debug|Win32
   {ACD6FCF4-0D76-4AFA-947C-1B2A9C4FFF13}.Debug|Win32.ActiveCfg = Release|Win32
   {ACD6FCF4-0D76-4AFA-947C-1B2A9C4FFF13}.Debug|Win32.Build.0 = Release|Win32
   {ACD6FCF4-0D76-4AFA-947C-1B2A9C4FFF13}.Debug|x64.ActiveCfg = Debug|Win32
   {ACD6FCF4-0D76-4AFA-947C-1B2A9C4FFF13}.Release|Any CPU.ActiveCfg = Release|Win32
   {ACD6FCF4-0D76-4AFA-947C-1B2A9C4FFF13}.Release|Win32.ActiveCfg = Release|Win32
 @@ -101,8 +101,8 @@ Global
   {0FF2C832-C71A-4EA3-8202-7BDEFB4C4464}.Release|x64.ActiveCfg = Release|Any CPU
   {0FF2C832-C71A-4EA3-8202-7BDEFB4C4464}.Release|x64.Build.0 = Release|Any CPU
   {64AE2B80-7D7E-4F02-987A-B2D939A335FC}.Debug|Any CPU.ActiveCfg = Debug|Win32
   {64AE2B80-7D7E-4F02-987A-B2D939A335FC}.Debug|Win32.ActiveCfg = Debug|Win32
   {64AE2B80-7D7E-4F02-987A-B2D939A335FC}.Debug|Win32.Build.0 = Debug|Win32
   {64AE2B80-7D7E-4F02-987A-B2D939A335FC}.Debug|Win32.ActiveCfg = Release|Win32
   {64AE2B80-7D7E-4F02-987A-B2D939A335FC}.Debug|Win32.Build.0 = Release|Win32
   {64AE2B80-7D7E-4F02-987A-B2D939A335FC}.Debug|x64.ActiveCfg = Debug|Win32
   {64AE2B80-7D7E-4F02-987A-B2D939A335FC}.Release|Any CPU.ActiveCfg = Release|Win32
   {64AE2B80-7D7E-4F02-987A-B2D939A335FC}.Release|Win32.ActiveCfg = Release|Win32