我一直在使用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单元放入使用interface。我在pcre.pas
中设置这些行 ...
{$DEFINE PCRE_LINKDLL}
{$IFDEF PCRE_STATICLINK}
{$UNDEF PCRE_LINKDLL}
{$ENDIF}
以前,它有效。但今天它没有。
答案 0 :(得分:10)
Delphi 2009似乎有* .obj文件导出问题。必须从代码中调用pcre_exec
函数。如果Delphi的“智能链接器”将其删除,因为它不会在代码中的任何位置调用(智能链接器不会删除),编译器将失败。这是一个编译器错误,但你可以通过对PerlRegEx库进行一些小改动来解决它。您必须向TPerlRegEx.Create
构造函数添加“UseFunction”本地过程(以及对它的调用)。因此,当您创建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;