MSBuild在Cpp.Targets中使用新的XE4项目搜索"True.dpr"失败

Dav*_*vid 5 msbuild c++builder delphi-xe4 c++builder-xe4

msbuild在RAD Studio XE4中遇到了一些奇怪的错误,我正在寻求帮助来诊断正在发生的事情.我已经遇到了这个问题已经有几个星期了,但是我自己也没有成功解决这个问题 - 时间问得更广泛了.症状是:

  • 通过在IDE中构建和运行的项目,msbuild Project.cbproj似乎可以正常工作
  • 正常运行msbuild Project.cbproj /t:Clean,并删除中间文件.输出的可视扫描不显示任何异常文件被删除 - 只有.obj文件,链接器状态文件,最终EXE等.
  • 但是在清洁或干净结账后运行msbuild Project.cbproj /t:Build或只是简单失败,并显示以下错误消息:msbuild Project.cbproj

Microsoft(R)Build Engine版本3.5.30729.5420 [Microsoft .NET Framework,版本2.0.50727.5472]版权所有(C)Microsoft Corporation 2007.保留所有权利.

Build build 12/09/2013 10:35:03.节点0上的项目"C:\ projects\Project.cbproj"(默认目标).

_PasDepCheck:已修改:Source\Common\resample.pas _PasCoreCompile:Embarcadero Delphi for Win32编译器版本25.0版权所有(c)1983,2013 Embarcadero Technologies,Inc.C:\ Program Files(x86)\ Embarcadero\RAD Studio\11.0\Bin\CodeGear.Cpp.Targets(191 1,5):错误F1026:找不到文件:'True.dpr'完成构建项目"C:\ projects\Project.cbproj"(默认目标) - 失败.

建立失败.

"C:\ projects\Project.cbproj"(默认目标)(1) - >(_PasCoreCompile目标) - > C:\ Program Files(x86)\ Embarcadero\RAD Studio\11.0\Bin\CodeGear.Cpp.Targets(1 911,5):错误F1026:找不到文件:'True.dpr'

0 Warning(s)
1 Error(s)
Run Code Online (Sandbox Code Playgroud)

有些事情让我觉得这个:

  • 它在顶部列出了两个版本的.Net,在方括号中列出了较旧的版本.它可以加载或使用两个框架的一部分吗?
  • True.dpr不存在,也无法找到手动搜索.cbproj文件True.dprTrue条目,或者查找(对我来说)可能被误解为项目名称的条目.(如果您不熟悉Delphi,.dpr文件是一个老式的项目文件 - 它包含入口点.构建一个可能意味着msbuild正在某处找到源或项目条目.'真'在我看来就像是. cbproj文件被误解或被破坏 - 但它是全新的,所以不应该,并且它可以在IDE中运行.)

有关系统和项目的其他信息:

  • 该项目正在从RAD Studio 2010升级.但是,项目文件是从头开始在XE4中创建的,即它是全新的,通过在IDE中创建一个新项目并添加现有单元(Delphi和C++文件).
  • 该项目是一个带有一个或两个Delphi单元的C++项目.在编译开始时编译Delphi单元时,您可以看到它正在崩溃.对于那些不熟悉混合C++和Delphi的人来说,通常在混合源项目中,IDE或msbuild会首先编译Delphi单元(这样做可以创建/更新C++头与Delphi代码接口.)
  • 该项目是一个小组之一,但应该独立编译.
  • 我安装了更新1的RAD Studio XE4.
  • msbuild正在从RAD Studio XE4命令行启动,即使用该rsvars.bat文件设置路径等的命令行.
  • 在上面的输出中,我已经将我们的实际项目名称更改为Project,因为我不想识别它.但是,输出的其余部分是准确的.

有任何想法吗?我一直试图解决它多年,我很难过.

小智 9

我在Delphi XE5中遇到了同样的错误.运行MSBUILD,/v:diag输出DCC32的完整命令行,DCC32 true在参数中有一个流氓.

以下页面指出了解决方案:http://wiert.me/2013/11/20/when-the-delphi-xe5-commandline-compiler-fails-with/

在这种情况下,我传递参数/p:DCC_DebugInformation=true,但这也可能在.dproj文件中.改变true2解决问题 - 即

MSBBUILD /p:DCC_DebugInformation=2 project.dproj
Run Code Online (Sandbox Code Playgroud)


Dav*_*vid 0

回答我自己的问题,希望对未来的读者有用。

这个评论很关键:

它在顶部列出了 .Net 的两个版本,旧版本放在方括号中。它可以加载或使用两个框架的一部分吗?

结果发现这根本不是项目名称。相反,我们编写了一个自定义构建记录器,用于与 RS2010 附带的 msbuild 版本一起使用。它是使用不同版本的 .Net 构建的,加载记录器 DLL 似乎会导致 msbuild 内部出现重大问题 - 这是可以理解的,因为我猜这意味着它正在加载两个不同版本的 .Net 运行时。

为什么这个答案可能是错误的:我确实尝试了没有自定义记录器的命令行(慢慢地一点一点地修剪我们旧的工作命令行,然后再次工作以找到问题。)那些sans -logger 构建也失败了,这让我有点疑惑。msbuild 崩溃实例的某些中间输出可能会混淆后续运行,或者 .Net 运行时中的某些内容缓存了 DLL 的使用或不同加载的运行时。我确实知道自定义记录器确实会导致问题,删除DLL 本身(此时一切才真正开始工作)以及从命令行中删除它就解决了问题。