为何Delphi编译器DCC64.exe编译时尝试使用32位单元库?
错误详情
Embarcadero Delphi for Win64编译器版本34.0
版权所有 (c) 1983,2021 Embarcadero Technologies, Inc.
FATestMA64.dpr(1) 致命错误: F2048 单元格式错误: 'C:\Program Files (x86)\Embarcadero\Studio\21.0\lib\win32\release\System.dcu' - 期望版本: 34.0, Windows Unicode(x64) 实际版本: 34.0, Windows Unicode(x86)
执行的编译命令
"C:\Program Files (x86)\Embarcadero\Studio\21.0\bin\DCC64.exe" /$D-,Q+,R-,W-,J+ /L /B FATestMA64.DPR /Ddebuginfo;autotest;notae;vcompnohalt;AllowDRPOForTests;D_64BIT > FATestMA64.logSS.txt
问题背景
- 已尝试多种编译指令调整,均无法解决错误
- 相同项目代码和编译命令在另一台机器可正常执行,推测为本地Delphi环境或默认配置差异导致
- 需求:无需通过
-I参数显式指定Win64单元路径,让编译器自动识别正确路径
项目.dproj配置片段
<PropertyGroup> <ProjectGuid>{12723496-eaf3-4544-a9he-ebb0432dd32e}</ProjectGuid> <MainSource>FATestMA64.dpr</MainSource> <Configuration Condition=" '$(Configuration)' == '' ">Release</Configuration> <DCC_DCCCompiler>DCC32</DCC_DCCCompiler> <DCC_DependencyCheckOutputName>FATestMA.exe</DCC_DependencyCheckOutputName> <ProjectVersion>19.2</ProjectVersion> <Config Condition="'$(Config)'==''">Release</Config> <FrameworkType>VCL</FrameworkType> <Base>True</Base> <Platform Condition="'$(Platform)'==''">Win64</Platform> <TargetedPlatforms>3</TargetedPlatforms> <AppType>Application</AppType> </PropertyGroup>
问题根源
错误核心是64位编译器DCC64在查找系统单元时,优先加载了Win32平台的System.dcu,导致单元架构与目标平台不匹配。
解决步骤
修正项目配置中的编译器指定
编辑.dproj文件,将<DCC_DCCCompiler>DCC32</DCC_DCCCompiler>修改为<DCC_DCCCompiler>DCC64</DCC_DCCCompiler>。即使使用命令行编译,项目配置中的编译器设置仍可能影响DCC64的默认路径搜索逻辑。检查并修复Delphi环境变量
确保系统环境变量中:PATH中Delphi 64位工具目录(C:\Program Files (x86)\Embarcadero\Studio\21.0\bin\win64)优先级高于32位目录BDSLIB、BDSINCLUDE等变量指向Win64平台的对应目录(C:\Program Files (x86)\Embarcadero\Studio\21.0\lib\win64\release)
另一台正常编译的机器大概率是这些环境变量配置正确。
命令行添加平台强制参数
在编译命令中加入/P:Win64参数,强制DCC64使用Win64平台的默认搜索路径,无需手动指定-I:"C:\Program Files (x86)\Embarcadero\Studio\21.0\bin\DCC64.exe" /$D-,Q+,R-,W-,J+ /L /B /P:Win64 FATestMA64.DPR /Ddebuginfo;autotest;notae;vcompnohalt;AllowDRPOForTests;D_64BIT > FATestMA64.logSS.txt验证Win64单元完整性
确认C:\Program Files (x86)\Embarcadero\Studio\21.0\lib\win64\release目录下存在完整的64位编译单元(包括System.dcu),若缺失可重新安装Delphi的Win64组件。
内容的提问来源于stack exchange,提问作者ogglethorp

