VS2010每次编译都重新编译整个工程的解决方案?

2013-09-15 02:27:26|? 分类: 默认分类 |? 标签: |举报 |字号大中小 订阅

点击打开链接

在使用VS2010编译C++程序的时候,每次修改工程中的某一个文件,点击“生成-仅用于项目-仅生成**”时,往往都是整个工程都需要重新编译一遍。由于这个工程代码量太大,每次编译完成都需要将近10分钟左右的时间编译。最烦人的时候是当编译完了出错,修改了错误再次编译,浪费很多时间。

那么怎么配置VS2010像VC6.0那样默认的可以只编译修改后的文件呢?

针对这个问题的解决办法网络上也有不少,在这里我整理下我修改的配置。

第一因时间引起的:

首先,在debug模式下,删除功能debug目录所有的文件。

然后依次找到:

项目-属性-配置属性-C/C++-代码生成-启用最小重新生成:Yes(/Gm)

项目-属性-配置属性-C/C++-常规-调试信息格式:程序数据库(/Zi)

属性-配置属性-链接器-常规-“启用增量链接”选择“是”

最后,最好还要修改一处:

工具-项目和解决方案-生成并运行?

运行时,当项目过期时,选择从不生成

勾选-在运行时仅生成项目和依赖项

MSBuild项目生成输出详细信息 选 ”最小“

第二预编译头文件引起的:

项目-属性-配置属性-预编译头文件:Use/Yu

一般情况下这样配置之后,VS2010就会在每次编译的时候只是编译修改过的文件

一、引言

在vs多项目解决方案中,有时候生成项目时需要编译所有子项目,当子项目数量多的时候,特别费时。而且有时候编译过程还产生一些奇怪的错误,比如: 多次编译后,项目又可以正常运行,真是头疼。虽然项目最终可以运行起来,但是问题不解决也是特别影响开发效率,于是决定将这些问题找出来。

二、分析

找到的相关博客也有类似的问题: 编译问题解决:LINK : fatal error LNK1104: 无法打开文件“*.dll” 其中EvComPortDeviced.lib 应该是该项目的输出文件,而此时却显示无法打开该文件。

觉得非常匪夷所思 T_T

明明是我要输出的文件,你却告诉我无法打开,这是因为什么原因呢?

原作者说是可能是因为EvComPortDeviced.lib 被其他程序占用了导致的这个文件不能被打开更改。然而到底是什么程序占用了这个文件呢?

查看任务管理器的时候发现Vs开了多个编译进程,同时编译多个项目。 猜想应该就是我原本的输出目录下已经存在了EvComPortDeviced.lib文件,所以同时编译多个项目的时候,可能有的项目依赖了该文件,就直接从输出目录中使用了这个文件。而这个文件所在的工程也在同时编译,当生成该文件时,发现文件被占用,所以就报错了。 为了证明这个猜想,把vs同时编译数量设为1。 再次编译就不会出现这个问题了。但是仍然需要重新编译多个子项目。于是又有问题,为什么EvComPortDeviced.lib所在的项目并没有更改,而每次编译的时候却一直需要重新生成该项目呢?

项目需要重新编译,说明该项目应该是已经过期了。但是我没有改动这个项目,为什么会存在过期问题呢? 参考VS2010每次调试都出现“此项目已经过期”提示 按原文的步骤操作,在DbgView中获取的信息类似

[36184] Project 'D:\MyCode\Study\HelloWorld\HelloWorld.vcxproj' not up to date because build input 'D:\MYCODE\STUDY\HELLOWORLD\TARGETVER.H'; is missing.

说是EvComPortDeviced工程无法更新,因为COMMONTOOLDLLD.lib已经改变了。也就是说EvComPortDeviced的依赖项改变了,所以这个工程也应该需要重新生成。而COMMONTOOLDLLD的工程我也没有改变过,为什么也需要重新生成?继续寻找COMMONTOOLDLLD的问题,结果发现COMMONTOOLDLLD的问题是说EvComPortDeviced.lib被更改了。也就是循环包含了。

查看代码,修改循环包含的问题,把项目的依赖项选项也设置好后,问题解决。

三、结语

有时候粗心大意,可能出现项目重复包含问题,当输出目录下已经存在原有的一个工程生成的lib文件,后续如果出现循环包含,编译器输出的信息有时候也不足以分析出问题。其实这个问题重新生成解决方案应该就能发现的了问题吧。

使用VS2010编译C/C++代码时,在工程目录下会自动生成ipch文件夹和.sdf文件,它们所占的内存很大,往往从10M到上100M不等,是VS用来保存预编译的头文件和自动补全功能分析代码数据。删掉的话对开发工程没什么影响,但会影响一些功能,现提供不影响功能,但让工程下不存在这些文件的方法。

1、打开vs,随便载入一个解决方案,或新建一个;

2、点开“工具”——“选项”;

3、左边依次点击“文本编辑器”——“C/C++”——“高级”,如下图所示

4、在“回退位置”下,将第一、二项改成“Ture”,在回退位置,输入你想要将其到的位置。