- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我使用 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。这是因为:
WideString
类型是系统 BSTR
类型的松散包装器。BSTR
的实现由 oleaut32 库提供。SysFreeString
。因此,无论您做什么,都无法消除对 msvcrt 的依赖。
但是,要回答您的问题,因为我喜欢回答问题,尤其是有关链接已编译对象的问题,您需要执行以下操作:
System.RegularExpressionsAPI.pas
并将其放在项目的源文件夹中。将其添加到项目中。现在,这是正则表达式库的其余部分所基于的单元。System.Win.Crtl
的引用。你会发现代码编译不通过,报如下错误:
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/
我使用 Delphi XE2 的内置 RegularExpressions 单元有一段时间了,直到我发现它的对象文件 (.obj) 依赖于 msvcrt。 dll,由 System.Win.Crtl
我是一名优秀的程序员,十分优秀!