Delphi 使用或不使用调试条件定义
在使用调试构建配置编译项目时,我有一个想法,就是在FullDebuggMode下使用FastMM4 当我选择调试构建配置时,Delphi会自动将调试设置为条件定义。因此,此代码应按预期工作:Delphi 使用或不使用调试条件定义,delphi,build-process,delphi-2009,conditional-compilation,Delphi,Build Process,Delphi 2009,Conditional Compilation,在使用调试构建配置编译项目时,我有一个想法,就是在FullDebuggMode下使用FastMM4 当我选择调试构建配置时,Delphi会自动将调试设置为条件定义。因此,此代码应按预期工作: unit uXTrackUpdater; program Test; uses {$IFDEF DEBUG}FastMM4,{$ENDIF} Forms; {$R *.res} begin Application.Initialize; Application.MainFormOnT
unit uXTrackUpdater;
program Test;
uses
{$IFDEF DEBUG}FastMM4,{$ENDIF}
Forms;
{$R *.res}
begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.Title := 'Test';
Application.CreateForm(TfrmTest, frmMain);
Application.Run;
它是有效的。但是,当我将构建配置更改为发布配置时。此代码也可以使用!它不应该吗?因为不应该定义调试条件
那么,有人能解释一下为什么不管构建配置如何,这段代码都会执行,以及如何正确设置它(只有在使用调试配置时才会编译FastMM4)
编辑后
对于FastMM,这只是一个例子。在这里发布我的问题之前,我已经在不同的案例中进行了测试。这是:
program Project21;
{$APPTYPE CONSOLE}
uses
{$IFDEF DEBUG} SysUtils; {$ENDIF}
begin
try
{ TODO -oUser -cConsole Main : Insert code here }
except
on E:Exception do //should not be found after rebuilding with RELEASE build configuration
Writeln(E.Classname, ': ', E.Message);
end;
end.
无论构建配置如何,上面的代码都将编译。为什么?
第二次编辑后
我知道,其他人说我的例子是预期的工作。但他们不是为我工作。我已经在Delphi2010上检查过这种行为,它是相同的(仍然不工作)
也许这会有帮助:我已经用RELEASE
替换了DEBUG
指令,看看会发生什么。结果是RELEASE
导致示例代码无法在两种配置中生成
第三次编辑:
我的dproj文件:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<ProjectGuid>{E9F0DC1F-23EC-46AA-97F8-68C007E77218}</ProjectGuid>
<ProjectVersion>12.0</ProjectVersion>
<MainSource>Project21.dpr</MainSource>
<Config Condition="'$(Config)'==''">Debug</Config>
<DCC_DCCCompiler>DCC32</DCC_DCCCompiler>
</PropertyGroup>
<PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''">
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="'$(Config)'=='Release' or '$(Cfg_1)'!=''">
<Cfg_1>true</Cfg_1>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_2)'!=''">
<Cfg_2>true</Cfg_2>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="'$(Base)'!=''">
<DCC_DependencyCheckOutputName>Project21.exe</DCC_DependencyCheckOutputName>
<DCC_ImageBase>00400000</DCC_ImageBase>
<DCC_UnitAlias>WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;$(DCC_UnitAlias)</DCC_UnitAlias>
<DCC_Platform>x86</DCC_Platform>
<DCC_E>false</DCC_E>
<DCC_N>false</DCC_N>
<DCC_S>false</DCC_S>
<DCC_F>false</DCC_F>
<DCC_K>false</DCC_K>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_1)'!=''">
<DCC_LocalDebugSymbols>false</DCC_LocalDebugSymbols>
<DCC_Define>RELEASE;$(DCC_Define)</DCC_Define>
<DCC_SymbolReferenceInfo>0</DCC_SymbolReferenceInfo>
<DCC_DebugInformation>false</DCC_DebugInformation>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_2)'!=''">
<DCC_Define>DEBUG;$(DCC_Define)</DCC_Define>
</PropertyGroup>
<ItemGroup>
<DelphiCompile Include="Project21.dpr">
<MainSource>MainSource</MainSource>
</DelphiCompile>
<BuildConfiguration Include="Base">
<Key>Base</Key>
</BuildConfiguration>
<BuildConfiguration Include="Debug">
<Key>Cfg_2</Key>
<CfgParent>Base</CfgParent>
</BuildConfiguration>
<BuildConfiguration Include="Release">
<Key>Cfg_1</Key>
<CfgParent>Base</CfgParent>
</BuildConfiguration>
</ItemGroup>
<Import Project="$(BDS)\Bin\CodeGear.Delphi.Targets" Condition="Exists('$(BDS)\Bin\CodeGear.Delphi.Targets')"/>
<ProjectExtensions>
<Borland.Personality>Delphi.Personality.12</Borland.Personality>
<Borland.ProjectType/>
<BorlandProject>
<Delphi.Personality>
<Source>
<Source Name="MainSource">Project21.dpr</Source>
</Source>
<Parameters>
<Parameters Name="UseLauncher">False</Parameters>
<Parameters Name="LoadAllSymbols">True</Parameters>
<Parameters Name="LoadUnspecifiedSymbols">False</Parameters>
</Parameters>
<VersionInfo>
<VersionInfo Name="IncludeVerInfo">False</VersionInfo>
<VersionInfo Name="AutoIncBuild">False</VersionInfo>
<VersionInfo Name="MajorVer">1</VersionInfo>
<VersionInfo Name="MinorVer">0</VersionInfo>
<VersionInfo Name="Release">0</VersionInfo>
<VersionInfo Name="Build">0</VersionInfo>
<VersionInfo Name="Debug">False</VersionInfo>
<VersionInfo Name="PreRelease">False</VersionInfo>
<VersionInfo Name="Special">False</VersionInfo>
<VersionInfo Name="Private">False</VersionInfo>
<VersionInfo Name="DLL">False</VersionInfo>
<VersionInfo Name="Locale">1045</VersionInfo>
<VersionInfo Name="CodePage">1250</VersionInfo>
</VersionInfo>
<VersionInfoKeys>
<VersionInfoKeys Name="CompanyName"/>
<VersionInfoKeys Name="FileDescription"/>
<VersionInfoKeys Name="FileVersion">1.0.0.0</VersionInfoKeys>
<VersionInfoKeys Name="InternalName"/>
<VersionInfoKeys Name="LegalCopyright"/>
<VersionInfoKeys Name="LegalTrademarks"/>
<VersionInfoKeys Name="OriginalFilename"/>
<VersionInfoKeys Name="ProductName"/>
<VersionInfoKeys Name="ProductVersion">1.0.0.0</VersionInfoKeys>
<VersionInfoKeys Name="Comments"/>
</VersionInfoKeys>
</Delphi.Personality>
</BorlandProject>
<ProjectFileVersion>12</ProjectFileVersion>
</ProjectExtensions>
</Project>
{E9F0DC1F-23EC-46AA-97F8-68C007E77218}
12
Project21.dpr
调试
DCC32
真的
真的
基础
真的
真的
基础
真的
Project21.exe
00400000
WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE$(DCC_UnitAlias)
x86
假的
假的
假的
假的
假的
假的
释放$(DCC_定义)
0
假的
调试$(DCC_定义)
主要来源
基础
Cfg_2
基础
Cfg_1
基础
Delphi.Personality.12
Project21.dpr
假的
真的
假的
假的
假的
1.
0
0
0
假的
假的
假的
假的
假的
1045
1250
1.0.0.0
1.0.0.0
12
谢谢。使用条件编译时,请确保始终在切换配置后进行生成。显然,当前的“defines”集合不是用于测试某个单元是否需要重新编译的密钥的一部分。如果您所更改的只是一个define(即:不再定义DEBUG),那么编译器根本不知道它,而是继续使用预编译单元
但由于这是关于FastMM4的,所以还有另一种方法:您可以为调试和发布定义
installOnlyFrunningINIDE
,除非您是从IDE运行,否则FastMM4不会安装它的内存管理器
编辑
考虑到您稍后的编辑,我认为您的项目的配置是罪魁祸首,因为IFDEF的工作很好。检查配置选项的两个分支,确保没有为发布和调试定义“调试”。显示调试是在基本配置上定义的(基本配置应具有公共编译设置)。更改基准时,所有未修改的设置默认为基准值
验证您是否无意中将调试放在基本配置而不是调试配置上。当然它“起作用”。有什么不工作的?或者您的意思是“它甚至在发布版本中也包含FastMM4”?如果您的项目中不包含FastMM4,Delphi将使用它自己的默认内存管理器。因此,代码也在发行版中运行。您的第二个代码示例显然不适用于所有构建配置。请复制并粘贴您编译并确认的真实代码,以表示您对其所做的声明。@Rob这是真实代码。为什么我要提交不同的东西?这段代码在Delphi2009上的两种配置中都适用。如果这是真的,那么这两种配置都定义了调试。如果没有定义DEBUG,就会出现语法错误,
使用的
子句中没有任何单位,没有分号。installOnlyFrunningINIDE
可能很有用,但我从不使用它,因为我想在调试版本中获得泄漏检测等,即使我没有附加调试程序。我总是在切换配置后重建项目。我已经更新了qestion。@Cosmin,关于您的编辑:我已经检查过几次了。另外,我在基本配置中没有任何条件定义。谢谢,但我在基本配置中没有任何条件定义。好吧,我这么说是因为它发生在我身上,几个月前。