在Delphi XE6中编译DLL时,它会自动从TMethodImplementationIntercept
导出函数System.Rtti.pas
。我试图找到一种方法来避免这种导出,但没有找到任何可以解决问题的配置或编译器指令。
System.Rtti单元几乎无法避免,因为它几乎被delphi中的所有东西间接使用。
在XE6中构建DLL时,有没有办法避免导出此函数?
答案 0 :(得分:6)
System.Rtti
单元中的代码如下所示:
{ This function has been added to be used from .s .c files in order to avoid use mangled names}
procedure TMethodImplementationIntercept(const obj:TMethodImplementation; AFrame: Pointer); cdecl;
begin
obj.Intercept(AFrame);
end;
exports TMethodImplementationIntercept;
此函数和exports
指令已添加到XE5中。
在XE6中构建DLL时,有没有办法避免导出此函数?
如果您的库包含System.Rtti
单元,则DLL将导出该功能。如果要生成不导出函数的DLL,我可以看到以下选项:
System.Rtti
。System.Rtti
。 在我看来,前两个选项并不是很吸引人。第三种选择看起来很有吸引力,但我认为这可能很难成功。似乎这个长期存在的伎俩不再起作用。我还没有能够重新编译RTL单元,并避免使用不同版本的Y 错误编译可怕的 X.
这样就留下了最后的选择。再一次,没有大量的吸引力。你可能决定只是把它搞砸并接受这种迷失的出口。也许质量控制报告可能会给Embarcadero带来一点压力,要求重新考虑这个决定。
对于它的价值,在我看来,编译器库代码不应该无条件地导出函数。它应该是图书馆的消费者,而不是作出决定的图书馆的实施者。