组件 Tperlregex 致命错误 L3169?

发布于 2024-12-18 01:44:39 字数 741 浏览 0 评论 0原文

我使用 Tperlregex 一段时间了。 但今天,当我尝试编译使用 Tperlregex 构建的应用程序时,它提示“致命错误:内部错误 L3169”。

reg: Tperlregex;

begin
reg:=Tperlregex.create(nil); //If this line is removed, there is no error prompt.
...
...
end;

我正在使用 Perlregex2009。

请帮忙。

编辑:

安德烈亚斯,非常感谢。

@Andreas 非常感谢您的立即回复。我正在使用 Delphi 7。你的答案在 D7 中有效吗?我在 pcre.pas 中找到了注释(..Delphi 2009 及更早版本有一个编译器错误,如果将 TPerlRegEx 安装到设计时包中,并且同时不将 TPerlRegEx 放入运行时包中,则可能会导致内部错误。对于 Delphi 2009 及更早版本,如果您根本不使用软件包,则可以使用 PCRE_STATICLINK(这意味着您不将其安装到 IDE 中...”)。我还没有安装它在 IDE 中,我将 perlregex 单元放入使用界面中,并在 pcre.pas 中设置了这些行

 ...
{$DEFINE PCRE_LINKDLL}
{$IFDEF PCRE_STATICLINK}
{$UNDEF PCRE_LINKDLL}
{$ENDIF} 

。以前,它有效,但今天不起作用。

I have been using Tperlregex for some time.
but today when I try to compile an app built with Tperlregex, it prompts" fatal error: Internal error L3169".

reg: Tperlregex;

begin
reg:=Tperlregex.create(nil); //If this line is removed, there is no error prompt.
...
...
end;

I am using Perlregex2009.

Please help.

Edit:

Andreas, Thank you so much.

@Andreas Thank you so much for your immediate reply. I am using Delphi 7. Does your answer work in D7. And I find notes in pcre.pas (..Delphi 2009 and earlier have a compiler bug that may cause an internal error if install TPerlRegEx into a design time package, and you don't put TPerlRegEx into a runtime package at the same time. With Delphi 2009 and earlier you can use PCRE_STATICLINK if you don't use packages at all (which means you don't install it into the IDE..."). I have not installed it in IDE and I am putting perlregex unit in uses interface. and I set these lines in pcre.pas

 ...
{$DEFINE PCRE_LINKDLL}
{$IFDEF PCRE_STATICLINK}
{$UNDEF PCRE_LINKDLL}
{$ENDIF} 

Previously, it worked. But today it does not.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

‖放下 2024-12-25 01:44:39

Delphi 2009 似乎在 *.obj 文件导出方面存在问题。必须从代码中调用 pcre_exec 函数。如果 Delphi 的“智能链接器”删除它,因为它在代码中的任何地方都没有被调用(智能链接器没有删除),则编译器将失败。这是一个编译器错误,但您可以通过对 PerlRegEx 库进行一些小更改来解决它。您必须将“UseFunction”本地过程(以及对它的调用)添加到 TPerlRegEx.Create 构造函数中。因此,当您创建 TPerlRegEx 对象时,智能链接器不会删除 pcre_exec 函数。

constructor TPerlRegEx.Create(AOwner: TComponent);

  procedure UseFunction(P: Pointer);
  begin
  end;

begin
  UseFunction(@pcre_exec); // if not used, D2009 will fail with internal compiler error
  UseFunction(@pcre_compile); // if not used, D7 will fail with internal compiler error
  inherited Create(AOwner);
end;

Delphi 2009 seems to have a problem with the *.obj file exports. The pcre_exec function must be called from the code. If Delphi's "smart linker" removes it because it isn't called anywhere in the code (that isn't removed by the smart linker), the compiler fails. This is a compiler bug, but you can work around it by making a small change to the PerlRegEx library. You have to add a "UseFunction" local procedure (and a call to it) to the TPerlRegEx.Create constructor. So when you create a TPerlRegEx object, the smart linker won't remove the pcre_exec function.

constructor TPerlRegEx.Create(AOwner: TComponent);

  procedure UseFunction(P: Pointer);
  begin
  end;

begin
  UseFunction(@pcre_exec); // if not used, D2009 will fail with internal compiler error
  UseFunction(@pcre_compile); // if not used, D7 will fail with internal compiler error
  inherited Create(AOwner);
end;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文