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

时间:2017-07-26 05:49:57

标签: c++ visual-studio visual-studio-2015 native static-linking

我已经连续15个小时尝试找到一种静态编译我的Native 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"Release\vc140.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\\Win32\src\%(RelativeDir)\" /Fp"Release\otclient.pch" 

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

/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没有列出。其中一个必然会导致你看到的问题。