Delphi编译器警告指向Delphi自己的单元

8
在Delphi 2007中,我正在开发一个包含自定义组件的项目。当我进行完整构建时(但不是直接编译),在消息中会得到以下一组警告作为前四个警告:
[DCC Warning] Dialogs.pas(1426): W1002 Symbol 'TFileOpenDialog' is specific to a platform
[DCC Warning] Dialogs.pas(1446): W1002 Symbol 'TFileSaveDialog' is specific to a platform
[DCC Warning] ComCtrls.pas(6757): W1036 Variable 'Section' might not have been initialized
[DCC Warning] ComCtrls.pas(19268): W1023 Comparing signed and unsigned types - widened both operands

我通常会尽可能消除编译器警告,但这些是“标准”Delphi单元。这些警告是否是我的代码间接导致的?如果是,我该如何找出原因和位置?如果不是,我应该怎么做?

8个回答

12

我相信这是因为您的构建路径中包含了Delphi的源代码。如果您移除了Delphi源代码目录,那么就可以在没有这些警告的情况下进行构建。


1
我在XE5中遇到了这个问题,但我不确定要删除哪个路径,你能告诉我具体是哪个路径吗? - zac

6
他们只在进行构建时出现的原因是编译命令只编译与上一次编译不同的源代码。而构建命令会重新编译项目中的所有内容,无论是否有更改。
警告很可能是由于将Delphi源文件夹包含在项目搜索路径中引起的。删除它并删除项目文件夹中的dcus将告诉您是否在重新编译时需要Delphi源。根据我的经验,如果您在Delphi的实现中发现了错误并制作了自定义副本以纠正该错误,则应该需要Delphi源。如果是这种情况,在没有Delphi源的情况下尝试构建时,通常会得到以下错误:
Unit '%s' is compiled with unit '%s' in '%s' but different version '%s' found (F2446)
其中%s将是某个低级别的Delphi类。
如果没有任何错误,则实际上不需要Delphi源。
如果Delphi源位于环境搜索路径中,也可能会发生这种情况。

3
你提到的前两个警告(以及其他一些警告)是为了让你意识到你目前使用的代码在Delphi支持的不同平台上无法编译。对于Delphi 2007,它所携带的残留部分包括已经消失的Linux版本Kylix和已经消失的.NET版本Delphi。

更近期的Delphi版本支持跨平台(Win32/Win64、OS X、iOS和Android),这时候开发Firemonkey应用程序(或者如果Win32和Win64之间存在差异,则是VCL应用程序)时,这些消息再次变得相关。它们指示您代码中需要针对不同操作系统进行调整的位置。(例如,你提到的两个警告是针对Windows特定对话框的;你需要基于目标平台使用不同的对话框,并在具有平台特定性的区域周围使用{$IFDEF}语句,以防止它们被编译到其他平台中。

由于你当前的代码是基于VCL的,因此即使在现代Delphi版本中也不能直接移植到除Windows之外的任何平台,因此你可以安全地关闭这些警告。使用Project->Options->Compiler Messages,并取消选中以下警告(或者使用我在你的代码中包含的编译器定义):

Library Symbol                       {$WARN SYMBOL_LIBRARY OFF}
Platform Symbol                      {$WARN SYMBOL_PLATFORM OFF}
Library Unit                         {$WARN UNIT_LIBRARY OFF}
Platform Unit                        {$WARN UNIT_PLATFORM OFF}
Unsafe type  (.NET remnant)          {$WARN UNSAFETYPE OFF}
Unsafe code  (.NET remnant)          {$WARN UNSAFECODE OFF}
Unsafe typecast (.NET remnant)       {$WARN UNSAFECAST OFF}

你提到的最后两个问题我用D2007(IDE版本11.0.2804.9245)无法重现,因此我怀疑skamradt的回答是正确的——这是因为你在搜索路径中设置了VCL源文件目录,而你不应该这样做。应该将其设置为$(BDS)\Lib。如果你需要能够逐步执行源代码,请使用项目 -> 选项 -> 编译器页面,并在调试下检查使用调试DCU选项。


2

2

我花了很长时间来解决这些问题(至少是前面两个),由于我的无知,我甚至卸载了 Delphi 并重新安装它,但没有任何作用。最终,我找到了问题的原因,是由于缺少项目设置导致的。至少在开始时,如果您从早期版本的 Delphi 迁移项目,则会转换现有的项目设置,但由于某些不明原因,Delphi 可能会开始忘记这一点,并为您提供“空白”的项目设置。您可以通过打开 Project-Options 来查看这一点,在那里您将找到基本设置、发布和调试。检查活动的(在项目管理器中加粗)并应该发现它没有目录路径,所有提示和警告都是默认值。其中大多数默认设置都没问题,但对于 Win32 东西,“平台符号”和“平台单元”应该被禁用。

祝好, Brian


2
如果您想继续将VCL源代码显式编译到您的项目中,您可以复制引发编译器提示/警告的单元,并在该副本中“修复”提示/警告。 将更新/“修复”的这些VCL单元放在另一个文件夹中,并确保在Delphi VCL源代码路径之前将该文件夹的路径添加到项目的搜索路径中。
例如,我的项目搜索路径看起来像这样:“C:\Dev\Source\MyFixedVCLUnits;C:\Program Files\CodeGear\RAD Studio\6.0\source”
为了举例说明消除这些警告所需的简单修复,这里是Dialogs.pas中的一个函数,现在位于我的“C:\Dev\Source\MyFixedVCLUnits”文件夹中:
{$WARNINGS OFF} function TFileOpenDialogWrapper.CreateFileDialog: TCustomFileDialog; begin Result := TFileOpenDialog.Create(nil); Result.OnExecute := OnExecuteEvent; end; {$WARNINGS ON}
在这种情况下,只需根据需要添加{$WARNINGS OFF}等即可。

1

如果您只为特定平台开发,请打开项目源代码并添加。

{$WARN SYMBOL_PLATFORM OFF}

0

编译器警告可以在项目选项中单独(按警告类型分别)禁用,具体位置为“Delphi编译器|提示和警告”


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接