链接到 CRT(未解析的外部符号 WinMainCRTStartup)

Linking to CRT (unresolved external symbol WinMainCRTStartup)

本文关键字:外部 符号 WinMainCRTStartup CRT 链接      更新时间:2023-10-16

我正在尝试创建一个Windows应用程序并静态链接到CRT。我收到此错误,

链接:错误LNK2001:未解析的外部符号WinMainCRTStartup

我正在使用此命令行进行编译

"C:Program Files (x86)Microsoft Visual Studio 12.0VCbinamd64cl.exe" /c main.cpp /O2 /I"C:Program Files (x86)Windows Kits8.1includeshared" /I"C:Program Files (x86)Windows Kits8.1includeum" /I"C:Program Files (x86)Windows Kits8.1includewinrt" /I"C:Program Files (x86)Microsoft Visual Studio 12.0VCInclude" /DWIN32 /D_WINDOWS /Zi /MT /nologo

并与此命令行链接

"C:Program Files (x86)Microsoft Visual Studio 12.0VCbinamd64link.exe" user32.lib libcmt.lib kernel32.lib main.obj crt_win64.obj /SUBSYSTEM:WINDOWS /DEBUG /nologo /MACHINE:x64 /LIBPATH:"C:Program Files (x86)Windows Kits8.1Libwinv6.3umx64" /LIBPATH:"C:Program Files (x86)Microsoft Visual Studio 12.0VCLib"

如您所见,我在编译器上使用/MT 开关,并在链接器上使用/SUBSYSTEM:WINDOWS 开关。

我也链接到libcmt.lib。

我的主函数的签名是

int __stdcall WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {

我错过了什么?

Necroposting

这里有一堆关于VStudioC/C++)构建的有用东西(我过去在处理各种挑战时遇到过):

  • [SO]:如何构建 libjpeg 9b 的 DLL 版本?(@CristiFati的回答)

  • [SO]:在Windows中安装Simstring(python)(@CristiFati的答案)

  • [SO]:如何在Visual Studio中包含OpenSSL(@CristiFati的答案)

  • [SO]:CLR Windows 窗体中的LNK2005错误(@CristiFati的答案)

  • [SO]:从不同VS2010项目中的C++代码调用C函数时出现链接器错误(@CristiFati的答案)

当然,一种方法是手动指定每条路径,但这可能会非常痛苦(尤其是在交叉构建时)。
这就是VCVarsAll(也是VSDevCmd,但我更喜欢前者)发挥作用的地方。它为当前构建配置设置所有与 VC 相关的路径(.lib 文件路径甚至构建工具),因此您不必担心它们。检查 [MS.Docs]:使用命令行中的Microsoft C++工具集了解更多详细信息。

一般来说,vcvarsall.bat(可能还需要检查[MS.MSDN.社交]:vcvarsall.bat文件在哪里?位于:

  • VStudio 20058) 及以上:

    • ${VSTUDIO_INSTALL_DIR}\VC
  • VStudio 201715) 及以上:

    • ${VSTUDIO_INSTALL_DIR}\VC\Auxiliary\Build

生成命令可能如下所示:


:: Setup build for pc064
"C:Program Files (x86)Microsoft Visual Studio 12.0VCvcvarsall.bat" amd64
:: Compile
cl /nologo /O2 /DWIN32 /D_WINDOWS /Zi /MD /Fomain.obj /c main.cpp
:: Link
link /NOLOGO /DEBUG /MACHINE:x64 /SUBSYSTEM:WINDOWS /OUT:main.exe main.obj kernel32.lib user32.lib

当然,您可以为构建创建一个 Makefile.mak:[MS.文档]:运行 NMAKE。

注意:由于 vcvarsall.bat 将(大量)目录添加到现有环境变量(PATHINCLUDE、LIBPATH等),因此多次启动它(在 pc032 和 pc064 构建之间切换)可能会导致达到变量字符限制 (32760)(这将触发问题)。因此,最好为每个目标 CPU 体系结构保持一个 Cmd 窗口打开(并且不要多次启动 VCVarsAll)。