无法生成完整的静态链接应用程序

Can't generate a full statically linked application

本文关键字:静态 链接 应用程序      更新时间:2023-10-16

我已经连续尝试了超过 15 个小时,以找到一种方法来静态编译我的原生C++游戏,使其不需要一些 DLL(我相信与 CRT 相关(。

下载我的游戏的用户抱怨缺少几个DLL,例如:

VCRUNTIME140.dll
api-ms-win-core-timezone-l1-1-0.dll
api-ms-win-core-timezone-l2-1-0.dll
api-ms-win-core-processthreads-l1-1-1.dll
(and the list goes on)

我目前的构建命令行是:

/MP /GS /GL /analyze- /W3 /Gy /Zc:wchar_t /Zi /Gm- /O2 /sdl
/Fd"Releasevc140.pdb" /Zc:inline /fp:precise /D "WIN32"
/D "_CRT_SECURE_NO_WARNINGS" /D "_WIN32_WINNT=0x0501" /D "BOT_PROTECTION"
/D "CLIENT" /D "FW_GRAPHICS" /D "FW_NET" /D "FW_XML"
/D "NDEBUG" /D "_MBCS" /errorReport:prompt /WX- /Zc:forScope /Gd /Oy- /Oi /MT
/Fa"Release" /EHsc /nologo
/Fo"Release\Win32src%(RelativeDir)" /Fp"Releaseotclient.pch" 

有什么想法吗?

/MT确实告诉编译器将 CRT 链接到可执行文件中。但是,如果另一个DLL 仍然依赖于VCRUNTIME140.DLL,则这是不够的。DLL可以依赖于其他DLL,甚至是循环的。Windows 只是按遇到的顺序加载它们,除非已经加载。因此,如果 TEST.EXE 依赖于 A.DLL,Windows 将加载 A.DLL。如果 A.DLL依赖于 B.DLL,Windows 将加载 B.DLL。如果 B.DLL 依赖于 A.DLL,则它已加载。

接下来,api-ms-...是新的Windows DLL。它们实现旧的Kernel32.DLL和类似的 DLL。它们不会导致对VCRUNTIME140.DLL的依赖。目前还不清楚你最终如何依赖这些。

然后是你没有列出的其他DLL。其中之一一定是导致您看到的问题。