【发布时间】:2010-09-09 22:39:09
【问题描述】:
我正在编译 DLL 两次(一次用于 x86,一次用于 x64)并且我已将 /ENTRY 设置为“DllMain”。我正在使用 /MT 运行时库选项静态链接到运行时库。在进行 x86 构建时,这一切都可以正常工作,但 x64 构建失败:
error LNK2019: unresolved external symbol main referenced in function __tmainCRTStartup
{project directory}\LIBCMT.lib(crt0.obj)
为什么这适用于 x86 构建而不是 x64 构建?我在这里有什么遗漏吗?
【问题讨论】:
-
你为什么使用 /ENTRY? IIRC,如果您使用的是标准 DllMain() 函数,则运行时会在没有任何额外帮助的情况下调用它。
-
如果我在 x86 DLL 中指定 /ENTRY,则 DLL 的最终大小为 5kb,如果我不设置 /ENTRY,则最终大小超过 50kb。
-
通常 real 入口点由 CRT 提供的“假” DllMain 获取,以初始化其内部数据结构(如此处所述:stackoverflow.com/questions/2674736/loading-a-dll-from-a-dll/…),所以你'重新绕过它。尺寸减小可能是由于删除了 CRT 初始化代码。您的 dll 正在使用未初始化的 CRT,这非常糟糕。
-
@Matteo:非常有趣,我不知道。您应该将此作为答案发布,以便我接受。 :)
-
好的,我之前没有发布它作为答案,因为它不完全是您问题的答案,而是运行时可能出现的另一个问题。 :)