在将RADScene安装到RAD Studio 2010中时,如何解决致命的编译器错误?

Dav*_*vid 7 delphi c++builder glscene

我正在尝试将GLScene安装到RAD Studio 2010中,目的是从大多数C++项目中使用它.我下载了最新的快照(5991,2011年11月)并且一直在尝试编译和安装两个主要的软件包: GLScene_DesignTimeGLScene_RunTime.我甚至没有尝试过其他一些库(CUDA等),我只想让基本软件包运行.

我遇到了一些问题,其中一个是我无法解决的问题,而且我正在寻求那些已成功安装GLScene的人的帮助,或者可能知道如何解决这些Delphi编译器错误.

第一个问题(解决?)

编译时,许多文件都出现以下错误:

[DCC Warning] GLSelection.pas(297): W1025 Unsupported language feature: 'abstract class method'
Run Code Online (Sandbox Code Playgroud)

这是由方法声明引起的:

TGLBaseSelectTechnique = class
  public
    class function IsSupported: Boolean; virtual; abstract;
Run Code Online (Sandbox Code Playgroud)

似乎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))
Run Code Online (Sandbox Code Playgroud)

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

[DCC Fatal Error] Spline.pas(1): F2084 Internal Error: AV062D8ED9-R00000003-0
Run Code Online (Sandbox Code Playgroud)

这表明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
Run Code Online (Sandbox Code Playgroud)

它停止了 它看起来像我尝试生成HPP文件时失败了.

我总是得到这两个失败中的一个. 第二个是我可以绑定到特定文件的唯一一个; 第一次在项目中途失败了,但是当它失败时我无法看到它到底在哪里.我正在从IDE内部编译.

我已经查看了Spline.pas,它似乎是非常基本的代码 - 我根本看不到任何异常.你可以在这里找到它,显然该文件已经被触摸了七年 ......所以我认为它应该编译:)

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

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

我在用:

  • RAD Studio 2010(完全修补并更新;安装了DDevExtensions和IDEFixPack.)
  • 2011年11月的快照; 我也尝试了2011年3月的快照,并遇到了同样的问题. 链接到这里的快照.
  • 通过更改链接器输出来生成C++ Builder文件来修改Delphi 2010包; 以及BCB 6包.两者都给出了同样的错误.

小智 5

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

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

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

- 来自Pal Wassail关于Embarcadero论坛帖子的帖子.


{quote:title = David M写道:} {quote}嗨,

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

这里是针对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;
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)
  1. 设置Delphi Compiler选项"Generate C++ .objs,headers,namespaces,export"
  2. 建立项目
  3. 然后Delphi XE3编译器生成错误的头文件Unit1.hpp:

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

  4. 如果您现在尝试在my.cbproj中使用此头文件Unit1.hpp,则会出现致命错误:"E2238 ...中的多个声明"

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

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

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

并且您可以在没有"多个声明"错误的情况下构建C++ Builder VCL应用程序.它是在2007年为旧的GLScene版本完成的,但现在你需要从VectorGeometry.pas模块开始重写新库中的部分代码.

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