【问题标题】:How can I solve fatal compiler errors when installing GLScene into RAD Studio 2010?将 GLScene 安装到 RAD Studio 2010 时,如何解决致命的编译器错误?
【发布时间】:2012-05-09 12:58:13
【问题描述】:

我正在尝试将 GLScene 安装到 RAD Studio 2010,目的是在主要是 C++ 项目中使用它。我下载了latest snapshot (5991, November 2011) 并一直在尝试编译和安装两个主要包:GLScene_DesignTimeGLScene_RunTime。我什至没有尝试过其他一些库(CUDA 等),我只想让基本包运行起来。

我遇到了许多问题,其中一个我无法解决,我正在寻求 SO 上成功安装 GLScene 或可能知道 的任何人的帮助>如何解决这些 Delphi 编译器错误。

第一个问题(已解决?)

编译时,一些文件报如下错误:

[DCC Warning] GLSelection.pas(297): W1025 Unsupported language feature: 'abstract class method'

这是由类似的方法声明引起的:

TGLBaseSelectTechnique = class
  public
    class function IsSupported: Boolean; virtual; abstract;

似乎 Delphi 2010 不支持虚拟抽象类方法,我已经通过删除 'abstract' 并提供一个虚拟实现来解决它,例如只是返回false

第二个问题(未解决)——Delphi编译器致命错误

我现在遇到两个更严重的错误。编译时,编译器失败如下:

[DCC Fatal Error] Exception EAccessViolation: Access violation at address 05AE8ED9 in module 'dcc140.dll'. Read of address 00000003
[DCC Error] Catastrophic failure (Exception from HRESULT: 0x8000FFFF (E_UNEXPECTED))

没有说明是什么文件造成的,但我认为这是由Spline.pas 造成的。偶尔而不是经常,我得到这个:

[DCC Fatal Error] Spline.pas(1): F2084 Internal Error: AV062D8ED9-R00000003-0

这表示Spline.pas,我认为第一个错误也可能与文件有关,因为在获得第一个错误之后如果我再清理项目,清理将失败,说它无法删除Spline.hpp。 (我必须关闭并重新打开 IDE。)Spline.hpp 仅包含以下内容:

// CodeGear C++Builder
// Copyright (c) 1995, 2009 by Embarcadero Technologies, Inc.
// All rights reserved

// (DO NOT EDIT: machine generated header) 'Spline.pas' rev: 21.00

#ifndef SplineHPP
#define SplineHPP

#pragma delphiheader begin
#pragma option push
#pragma option -w-      // All warnings off
#pragma option -Vx      // Zero-length empty class member functions
#pragma pack(push,8)
#include <System.hpp>   // Pascal unit
#include <Sysinit.hpp>  // Pascal unit

然后它就停止了。在我看来,尝试生成 HPP 文件时失败了。

我总是遇到这两个失败之一。第二个是我唯一可以绑定到特定文件的;第一个在项目进行到一半时失败了,但我看不到它失败时的位置。我正在从 IDE 内部编译。

我查看了Spline.pas,它看起来很基本的代码 - 我根本看不到任何异常。你可以find it here,显然文件hasn't been touched for seven years...所以我认为它应该编译:)

如果我更改项目设置使其不生成标头,则可以正常编译。 (只生成 obj 文件,以及任何其他不包含“标题”的设置,都可以正常工作。)但这对我来说不是一个好的解决方法 - 毕竟,我需要从 C++ Builder 中使用它,所以我的正常设置是“生成所有 C++ Builder 文件”。至少,我需要 HPP 和 OBJ 文件。

这里有人在最新版本的 C++ Builder 中使用过 GLScene 吗?你遇到过类似的问题吗?知道如何解决这个问题吗?

我正在使用:

  • RAD Studio 2010(已全面修补并保持最新;已安装 DDevExtensions 和 IDEFixPack。)
  • 2011 年 11 月的快照;我也尝试了 2011 年 3 月的快照,但遇到了同样的问题。 Link to snapshots here
  • Delphi 2010 软件包修改,通过更改链接器输出来生成 C++ Builder 文件;还有 BCB 6 包。两者都给出相同的错误。

【问题讨论】:

  • 如果对你有什么安慰的话,我在 Spline.pas 中得到了完全相同的致命错误 - 听起来像是 Embarcadero QC 的一个错误:-(
  • 谢谢罗迪。很高兴知道,对于好的某些定义;)我可能会看看是否可以打开支持案例。我担心只是进入 QC 不会有太大的收获。
  • 是的,但不向 QC 报告可以保证达到更少!
  • 好点。 Done. 你介意发表评论说你也可以复制吗?

标签: delphi c++builder glscene


【解决方案1】:

编辑: GLScene 现在与 RAD Studio XE3(包括 C++ Builder)兼容。

现在 GLScene 与 Embarcadero RAD Studio 完全兼容 C++Builder XE3 在设计和运行时模式下。

您可以从http://yadi.sk/d/o1QGI2KA10MK1 (95Mb) 下载它

--来自Pal Wassail's post on the Embarcadero forum thread


{quote:title=David M 写道:}{quote} 你好,

我正在尝试将 GLScene 安装到 RAD Studio... 大卫

这里有更简单的 Delphi XE3 头文件生成器的 EMB 开发者测试 -

1.创建一个VCL表单应用程序 2.在Unit1.pas接口部分添加

type
 TVector3f = array[0..2] of single;
 TVector4f = array[0..3] of single;

 function VectorAdd(const v : TVector3f; const f : Single) : TVector3f; overload;
 function VectorAdd(const v : TVector4f; const f : Single) : TVector4f; overload;

3.在实现部分添加

function VectorAdd(const v : TVector3f; const f : Single) : TVector3f;
begin
  Result[0]:=v[0]+f;
  Result[1]:=v[1]+f;
  Result[2]:=v[2]+f;
end;

function VectorAdd(const v : TVector4f; const f : Single) : TVector4f;
begin
   Result[0]:=v[0]+f;
   Result[1]:=v[1]+f;
   Result[2]:=v[2]+f;
   Result[3]:=v[3]+f;
end;
  1. 设置 Delphi 编译器选项“生成 C++ .objs、标头、命名空间、导出”
  2. 构建项目
  3. 然后Delphi XE3编译器生成错误的头文件Unit1.hpp,行:

    extern PACKAGE TVector3f __fastcall VectorAdd (float const v, const float f)/ 重载 */; extern PACKAGE TVector4f __fastcall VectorAdd (float const v, const float f)/ 重载 */;

  4. 如果您现在尝试在 my.cbproj 中使用此头文件 Unit1.hpp,您将收到致命错误: “E2238 中的多个声明……”

是的,如果将向量数组类型更改为记录:

 TVector3f = record
    case boolean of
      true  : (Coord: array[0..2] of single);
      false : (X,Y,Z: single);
end;
  • 那么问题就可以解决了,因为这种情况下Delphi编译器会生成

    extern PACKAGE Vectortypes::TVector3f __fastcall VectorAdd (const Vectortypes::TVector3f &v, const float f)/* 重载 */; extern PACKAGE Vectortypes::TVector4f __fastcall VectorAdd (const Vectortypes::TVector4f &v, const float f)/* 重载 */;

并且您可以构建您的 C++Builder VCL 应用程序而不会出现“多重声明”错误。它是在 2007 年为旧 GLScene 版本完成的,但现在您需要在新库中重写部分代码,从 VectorGeometry.pas 模块开始。

  1. 有第二种方法可以修复此类自动头文件错误 - 改进 Delphi 编译器中的生成 C/C++ 头文件、命名空间和包选项。但它掌握在 EMB 开发人员手中。

【讨论】:

  • 朋友,我从您在 Embarcadero 论坛上的回复中添加了一段引用,并将此答案标记为正确。谢谢!
  • 嗨,朋友。我reported 关于你对official GLScene forum 的补丁,现在你的补丁已应用于官方GLScene 存储库(sourceforge.net/projects/glscene/develop)。见 r6128-r6136。能否请您确认一下 SVN 中继版本?
【解决方案2】:

我是这样做的:

  • Download and extract this ZIP file(直接进入 GLScene 根目录,必要时允许覆盖)
  • 加载适当的 RAD Studio 版本(2007 到 XE2)并打开文件 *GLScene_Group.groupproj*(其中 = 您的 RAD Studio 版本)
  • 按组顺序构建/安装每个包

我已经仔细组装了这些固定包,以确保它们从 2007 年到 XE2 都能正常安装和运行。一些包(在每个组的底部)需要额外的依赖项才能运行(例如 Python 包),因此请注意这些。

我已经测试并确认这些只能在 RAD Studio 2007 到 XE2 上运行

不要忘记将 \Source 文件夹(和所有子文件夹)添加到搜索路径(IDE 本身或单个项目,如您所愿),否则使用 GLScene 组件的项目将无法编译缺少单元的抱怨。​​

享受吧!

【讨论】:

  • 听起来很有用!你做了什么来创建那些导致我的结果不同的包?这将是非常有用的信息 :) 此外,将这些作为补丁提供给 GLScene 可能是值得的。
  • 我只是用正确版本的 Delphi 加载了 DPK 文件,修改了搜索路径以便可以找到所有必要的源文件,将它们组织成一个组内的“安装顺序”,测试它们,压缩将生成的文件放到网上供您欣赏:)
  • 好的,谢谢!但这与我所做的非常接近……令人费解。不过我很高兴你的工作:)
  • 这可能是我们以不同方式处理的一些看似微不足道的细节……不确定!
【解决方案3】:

不适用于 RAD Studio 2009,但对于 BCB6 中的旧 GLScene 安装,她运行良好。但是在 RAD Studio XE/XE2/XE3 中安装后的当前版本根本不起作用。似乎主要问题隐藏在 Vectorgeometry.pas 中过程的重载机制中,因此 Delphi 编译器(使用所有 C++ 文件和包的输出选项)在 Vectorgeometry.hpp 和其他中创建重合字符串。因此,您在 C++Builder 面板中有可视组件,但您的应用程序在构建过程中失败并出现错误。它必须由 GLScene 开发人员在 .pas 文件中修复。

当您尝试在 C++Builder XE3 下使用 GLScene 构建应用程序时,您将在 glcrossplatform.hpp、vectorgeometry.hpp 等中遇到超过 50 个 BCC32 错误。有一种方法可以自行决定修复库。制作 GLScene 目录的新副本。在 GLCrossPlatform.pas 中将程序 RGB 重命名为 GLRGB(它的工作!)。然后在 VectorGeometry.pas 和许多其他源代码文件中更改所有重载过程,参数名称略有不同,因此在 Delphi 选项输出 C++(包含包的最后一个选项)之后,您不应在 .hpp 文件中遇到重合过程。然后重建所有 GLScene 包。在过程结束时,我希望它应该适用于 C++Builder XE3。

【讨论】:

    【解决方案4】:

    我有完全相同的错误。

    @第二个问题

    转到“spline.pas”并更改

    TCubicSplineMatrix = array of array[0..3] of Single;

    TCubicSplineMatrixEx = array[0..3] of Single;

    TCubicSplineMatrix = array of TCubicSplineMatrixEx;

    现在“Rad Studio 2009”可以为 C++Builder 编译和安装 GLScene。我可以启动一个新的 C++Builder VCL 应用程序并从工具箱中选择 GLScene 组件并放入我的 VCL 表单。

    我认为,这是您基本问题的解决方案,但不幸的是我无法成功编译我的 VCL 项目。我在 glcrossplatform.hpp 和 vectorgeometry.hpp 中得到超过 50 个 BCC32 错误。如果有人可以在这里提供帮助,那就太好了。

    @你的第一个问题

    我也收到此警告,但我没有对此进行任何更改。直接忽略?!

    【讨论】:

    • 谢谢,很高兴知道这一点。也许您可以将您的更改添加到 GLScene 人员,以便他们可以将它们包含在他们的下一个版本中?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-08
    • 1970-01-01
    相关资源
    最近更新 更多