在使用VS2010编译C++程序的时候,每次修改工程中的某一个文件,点击“生成-仅用于项目-仅生成**”时,往往都是整个工程都需要重新编译一遍。由于这个工程代码量太大,每次编译完成都需要将近10分钟左右的时间编译。最烦人的时候是当编译完了出错,修改了错误再次编译,浪费很多时间。那么怎么配置VS2010像VC6.0那样默认的可以只编译修改后的文件呢?针对这个问题的解决办法网络上也有不少,在这里我整理下我修改的配置。

第一因时间引起的:

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

然后依次找到:

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

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

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

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

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

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

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

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

?

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

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

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

转载于:https://www.sxzhongrui.com/xumaojun/p/8527725.html

一、引言

在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文件,后续如果出现循环包含,编译器输出的信息有时候也不足以分析出问题。其实这个问题重新生成解决方案应该就能发现的了问题吧。

#pragma once是一个预编译命令,用在头文件的开头,可以防止同一个物理文件只被编译一次。

但是#pragma once是编译器相关的,如果跨平台最好使用#ifndef? #define #endif,这是C/C++语言中的宏定义。

现在使用VS2013的类向导创建出来的类的头文件第一行自动加了#pragma once了。