【问题标题】:Delphi compiler warnings pointing to Delphi's own unitsDelphi 编译器警告指向 Delphi 自己的单元
【发布时间】:2010-10-26 15:10:04
【问题描述】:

在 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 单元。这些警告是我代码中某些内容的间接结果吗?如果是这样,我如何弄清楚什么/在哪里?如果没有,我该怎么办?

【问题讨论】:

    标签: delphi ide compiler-construction custom-component


    【解决方案1】:

    我相信这是因为您的构建路径中有现有的 Delphi 源代码。如果您删除 Delphi 源目录,那么它应该在没有这些警告的情况下构建。

    【讨论】:

    • 我在XE5中遇到了这个问题,但是我不确定要删除哪个路径,您能准确说出哪个路径吗?
    【解决方案2】:

    它们仅在进行构建时出现的原因是编译命令仅编译自上次编译以来已更改的源。而 Build 命令会重新编译项目中的所有内容,而不考虑更改。

    这些警告很可能是由项目搜索路径中包含 Delphi 源文件夹引起的。删除它并删除项目文件夹中的 dcus 将告诉您在重新编译时项目中的任何内容是否需要 Delphi 源代码。根据我的经验,如果您在 Delphi 的实现中发现了错误并制作了 Delphi 类的自定义副本来纠正错误,您应该需要 Delphi 源代码。如果是这种情况,当您尝试在没有 Delphi 源的情况下进行构建时,您通常会得到:

    单元“%s”是用单元“%s”编译的 在 '%s' 但不同的版本 '%s' 找到 (F2446)

    %s 将是一些低级别的 Delphi 类。

    如果您没有收到任何错误,则实际上并不需要 Delphi 源代码。

    如果 Delphi 源代码位于 环境 搜索路径中,也会发生这种情况。

    【讨论】:

      【解决方案3】:

      您提到的前两个警告(以及其他几个警告)是为了让您意识到您当前使用的代码不会在 Delphi 支持的不同平台上编译。对于 Delphi 2007,没有多少,但它带有 Kylix(已消失的 Linux 版本)和 Delphi for .NET(也已消失)的残余。

      最新版本的 Delphi 支持跨平台(Win32/Win64、OS X、iOS 和 Android),这些消息在开发 Firemonkey 应用程序(或 VCL 应用程序,如果 Win32 和 Win64 之间存在差异)时再次相关。它们指示代码中的点,您必须针对不同的操作系统对代码进行调整。 (例如,您引用的两个是针对特定于 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。如果您需要能够单步调试源代码,请使用Project->Options->Compiler 页面,并改为选中Debugging 下的Use debug DCUs 选项。

      【讨论】:

        【解决方案4】:

        我花了很长时间来解决这些问题(好吧,无论如何都是你的前两个),并且在我的无知中实际上卸载了 Delphi 并重新安装了它,但无济于事。最后发现是项目设置不足造成的。至少一开始,如果您从早期的 Delphi 迁移项目,您现有的项目设置会被转换,但没有明显的原因,Delphi 会开始忘记这一点,并为您提供一组“空白”项目设置。您可以通过打开 Project-Options 来查看这一点,您将在其中找到 Base、Release 和 Debug。查看活动的(在项目管理器中以粗体显示),您应该会看到它没有目录路径以及默认情况下的所有提示和警告。这些默认值中的大多数都很好,但应该禁用“平台符号”和“平台单元”(至少对于 Win32 的东西)。 问候, 布赖恩

        【讨论】:

          【解决方案5】:

          如果您想继续将 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} 等即可。

          【讨论】:

            【解决方案6】:

            TFileOpenDialog 仅适用于 Windows Vista 及更高版本。您应该使用 TOpenDialog 而不是 TFileOpenDialog,在较新的 Delphi 版本中,它将检测正在运行的操作系统并显示正确的对话框。
            https://forums.embarcadero.com/thread.jspa?threadID=70498

            【讨论】:

              【解决方案7】:

              如果你只为特定平台开发开源项目源码并添加

              {$WARN SYMBOL_PLATFORM OFF}
              

              【讨论】:

                【解决方案8】:

                编译器警告可以在 'Delphi Compiler |提示和警告'

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-10-15
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-01-06
                  • 2013-12-24
                  • 2015-12-04
                  相关资源
                  最近更新 更多