gpt4 book ai didi

c - Delphi PerlRegEx : Link . 静态 obj 文件,因此它们不依赖于 msvcrt.dll

转载 作者:太空宇宙 更新时间:2023-11-04 00:06:32 25 4
gpt4 key购买 nike

我使用 Delphi XE2 的内置 RegularExpressions 单元有一段时间了,直到我发现它的对象文件 (.obj) 依赖于 msvcrt。 dll,由 System.Win.Crtl 包装。这让我有点难过,因为我一直为 Delphi 构建没有运行时依赖性的可执行文件的方式感到自豪,这与 VB 或 VC++(默认情况下)不同。

我尝试静态编译/链接 C .obj 文件,这样它们就不会依赖于 msvcrt.dll,但我的 C/C++ 技能有限。我试图在 Visual Studio Express 中完成,但没有成功。有没有办法在 Win32 和 Win64 平台上实现这一点?

我使用的 PerlRegEx 版本是 7.9 2009-04-11,可在此处获取:http://www.regular-expressions.info/download/TPerlRegEx.zip . .obj 文件位于 pcre 文件夹中。

.obj 文件的 C 源代码在这里:http://ufpr.dl.sourceforge.net/project/pcre/pcre/7.9/pcre-7.9.zip

如有任何建议,我们将不胜感激。


我只查看了 exe 的导入表。即使我不使用 RegularExpressions 单元,也没有看到 msvcrt.dll 在执行期间被加载。我在过去看到过一些与它相关的错误,并且与 RegularExpressions 导致 msvcrt.dll 添加到导入中的事实错误相关。抱歉浪费您的时间。

最佳答案

这是一项毫无意义的任务。普通 VCL 表单应用程序将加载系统 msvcrt 库。是的,这是一个系统库。它作为标准操作系统库分发。所有系统都有。在这方面,它与 user32、advapi 等没有什么不同。

因此,通过删除正则表达式代码对 msvcrt 的依赖性不会使您的程序具有更少的依赖性。更重要的是,依赖系统库没有什么可怕的。

您可能会问为什么 Delphi 应用程序依赖于 msvcrt。这是因为:

  1. WideString 类型是系统 BSTR 类型的松散包装器。
  2. BSTR 的实现由 oleaut32 库提供。
  3. 一个普通的 Delphi 程序,根本不使用任何单位,加载时依赖于oleaut32 以提供,例如,SysFreeString
  4. oleaut32 库又依赖于 msvcrt。

因此,无论您做什么,都无法消除对 msvcrt 的依赖。


但是,要回答您的问题,因为我喜欢回答问题,尤其是有关链接已编译对象的问题,您需要执行以下操作:

  1. 复制一份 System.RegularExpressionsAPI.pas 并将其放在项目的源文件夹中。将其添加到项目中。现在,这是正则表达式库的其余部分所基于的单元。
  2. 在实现部分的顶部,删除对 System.Win.Crtl 的引用。
  3. 编译您的项目。

你会发现代码编译不通过,报如下错误:

E2065 Unsatisfied forward or external declaration: '_strncmp'E2065 Unsatisfied forward or external declaration: '_memmove'E2065 Unsatisfied forward or external declaration: '_memset'E2065 Unsatisfied forward or external declaration: '_memcpy'E2065 Unsatisfied forward or external declaration: '_memcmp'E2065 Unsatisfied forward or external declaration: '_strlen'E2065 Unsatisfied forward or external declaration: '__ltolower'E2065 Unsatisfied forward or external declaration: '_islower'E2065 Unsatisfied forward or external declaration: '__ltoupper'E2065 Unsatisfied forward or external declaration: '_isdigit'E2065 Unsatisfied forward or external declaration: '_isupper'E2065 Unsatisfied forward or external declaration: '_isalnum'E2065 Unsatisfied forward or external declaration: '_isspace'E2065 Unsatisfied forward or external declaration: '_isxdigit'E2065 Unsatisfied forward or external declaration: '_isgraph'E2065 Unsatisfied forward or external declaration: '_isprint'E2065 Unsatisfied forward or external declaration: '_ispunct'E2065 Unsatisfied forward or external declaration: '_iscntrl'E2065 Unsatisfied forward or external declaration: '_isalpha'E2065 Unsatisfied forward or external declaration: '_strchr'

In order for the compiler to compile this unit, it must be able to resolve these symbols in the modified System.RegularExpressionsAPI.pas unit. Using System.Win.Crtl is what makes that happen in the plain RTL. If you want to avoid linking System.Win.Crtl then you need to provide implementations. For instance, here is _strlen.

function _strlen(P: PAnsiChar): size_t; cdecl;
begin
Result := System.SysUtils.StrLen(P);
end;

将其添加到修改后的 System.RegularExpressionsAPI.pas 单元,您就解决了依赖关系。您现在只需要为所有其他人继续这样做。这是规定,链接到编译对象票价。

但是,正如我试图阐明的那样,我不建议这样做。您正在为自己创造不会带来明显 yield 的工作。您最终会在程序中得到比以前更多的代码。在实现这些 C 运行时函数时,您很有可能会犯错误。您将投入大量时间,并最终得到一个比您现在拥有的更糟糕的程序。

关于c - Delphi PerlRegEx : Link . 静态 obj 文件,因此它们不依赖于 msvcrt.dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22208455/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com