C++ msbuild的vc++;使用VS2015项目和解决方案构建后的解决方案清洗项目

C++ msbuild的vc++;使用VS2015项目和解决方案构建后的解决方案清洗项目,c++,makefile,tfs,msbuild,C++,Makefile,Tfs,Msbuild,我一直在重新设计我的自定义VC++构建,以与新的TFS 2015构建解决方案兼容 问题正在运行msbuild。我可以发布一个简化版本,但我的解决方案包含两项: 1个Makefile项目,用于构建所需的所有库,以及 1.exe项目 我在.exe项目中有一个对makefile项目的引用,因此.exe的生成会在需要时强制生成库 我们看到的问题是,当我们使用解决方案的msbuild进行重建时,它首先重建库,然后当它到达.exe时,它会清理库项目,导致删除一些重建的文件,然后阻止.exe文件的链接,因为.

我一直在重新设计我的自定义VC++构建,以与新的TFS 2015构建解决方案兼容

问题正在运行msbuild。我可以发布一个简化版本,但我的解决方案包含两项:

1个Makefile项目,用于构建所需的所有库,以及 1.exe项目

我在.exe项目中有一个对makefile项目的引用,因此.exe的生成会在需要时强制生成库

我们看到的问题是,当我们使用解决方案的msbuild进行重建时,它首先重建库,然后当它到达.exe时,它会清理库项目,导致删除一些重建的文件,然后阻止.exe文件的链接,因为.lib文件已被删除

为什么要再次清理makefile项目?似乎当它进入.exe项目时,它会重新解析依赖项,并且不知道库项目已经重建


提前谢谢。Larry

如果多个项目位于同一文件夹中,Visual Studio将在编译下一个项目时尝试删除输出文件夹(通常是调试或发布)。最好的解决方案是将每个项目放在单独的文件夹中。

如果多个项目位于同一文件夹中,Visual Studio将在编译下一个项目时尝试删除输出文件夹(通常是调试或发布)。最好的解决方案是将每个项目放在单独的文件夹中。

我没有详细介绍所有细节,但发生这种情况的原因是,在命令行上构建时,重建exe项目会导致exe项目的Clean+Build,exe项目的Clean目标最终调用
CleanReferencedProjects
目标,这将导致在Makefile项目上调用Clean(以及以后的构建)

此CleanReferencedProjects取决于属性
BuildingSideVisualStudio
BuildingProjectReferences
,因此BuildingInsideVS无论如何都会跳过此步骤,因为BuildingSideVisualStudio是真的,甚至有文档记录:

直接从命令行生成项目时,请清除那些引用的项目 存在于磁盘上的。对于IDE生成和命令行.SLN生成,解决方案生成管理器 处理好这件事

BuildProjectReferences属性记录如下:

默认情况下,我们将生成(如果适用,则清除)所有项目引用。但这可以用来禁用它

因此,一种可能的解决方案是调用
msbuild some.sln/t:Rebuild/p:BuildProjectReferences=False
。在只有2个项目的情况下,这将正常工作,但我不能保证这将始终在更复杂的情况下与更多的项目间的依赖性工作

现在有一件事让我疑惑:为什么我自己从来没有见过这种行为?答案是,我不经常使用MaFaFipe项目,而我所使用的C++项目略有不同:在那里,ReBuID目标是以Cudie+Bug定义的(对于MaFaFipe项目,它是独立的、独立的目标)。因此,当EXE项目调用BuudProjcReTrices时,它将在C++项目中调用Clear,但这会导致

Target "Clean" skipped. Previously built successfully.

因为C++项目的重建被称为“干净和构建”。

因此,另一种可能的解决方案是对Makefile项目执行相同的操作。你说你的重建有额外的要求;我不知道它们是什么,也不知道为什么需要它们(可以说,重建与Clean+Build没有相同的效果是错误的),但无论如何,这可能会起作用,例如在makefile项目中(一直到文件末尾):


每件事都是正确的,清洁/构建只调用一次


如果这些解决方案都不适用,我不会立即看到其他方法,除了从解决方案中删除makefile项目,并在本地和TFS中手动在解决方案之前构建它。

我没有详细介绍所有细节,但发生这种情况的原因是,在命令行上构建时,重建exe项目会导致exe项目的Clean+生成,并且exe项目的Clean目标最终会调用
CleanReferencedProjects
目标,这会导致在Makefile项目上调用Clean(以及以后的生成)

此CleanReferencedProjects取决于属性
BuildingSideVisualStudio
BuildingProjectReferences
,因此BuildingInsideVS无论如何都会跳过此步骤,因为BuildingSideVisualStudio是真的,甚至有文档记录:

直接从命令行生成项目时,请清除那些引用的项目 存在于磁盘上的。对于IDE生成和命令行.SLN生成,解决方案生成管理器 处理好这件事

BuildProjectReferences属性记录如下:

默认情况下,我们将生成(如果适用,则清除)所有项目引用。但这可以用来禁用它

因此,一种可能的解决方案是调用
msbuild some.sln/t:Rebuild/p:BuildProjectReferences=False
。在只有2个项目的情况下,这将正常工作,但我不能保证这将始终在更复杂的情况下与更多的项目间的依赖性工作

现在有一件事让我疑惑:为什么我自己从来没有见过这种行为?答案是,我不经常使用MaFaFipe项目,而我所使用的C++项目略有不同:在那里,ReBuID目标是以Cudie+Bug定义的(对于MaFaFipe项目,它是独立的、独立的目标)。因此,当EXE项目调用BuudProjcReTrices时,它将在C++项目中调用Clear,但这会导致

Target "Clean" skipped. Previously built successfully.

因为C++项目的重建被称为