链接到 CRT(未解析的外部符号 WinMainCRTStartup)
Linking to CRT (unresolved external symbol WinMainCRTStartup)
我正在尝试创建一个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。
这里有一堆关于VStudio(C/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 2005 (8) 及以上:
- ${VSTUDIO_INSTALL_DIR}\VC
-
VStudio 2017 (15) 及以上:
- ${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 将(大量)目录添加到现有环境变量(PATH、INCLUDE、LIBPATH等),因此多次启动它(在 pc032 和 pc064 构建之间切换)可能会导致达到变量字符限制 (32760)(这将触发问题)。因此,最好为每个目标 CPU 体系结构保持一个 Cmd 窗口打开(并且不要多次启动 VCVarsAll)。
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- 未解析的外部符号_MsiLocateComponentW@12.
- 在C++中使用 gRPC 时未解析的外部符号
- LibPrivoxy: 未解析的外部符号 __declspec(dllimport) int __stdcall Sta
- 尝试从 XamlApplication 编译 C++/WinRT 空白应用程序时,我收到未解析的外部符号 winrt_make_*
- 我收到错误LNK2001:未解析的外部符号(C++代码)
- 可视抽象类 c++(错误 LNK 2001:未解析的外部符号)
- 如何摆脱C++中未解析的外部符号"private: static char"错误?
- 当 lib 已添加到其他依赖项时,如何在 VS 中调试未解析的外部符号错误
- 仅在少数方法(静态或共享库)中解析的外部符号
- 未解析的外部符号"__declspec(dllimport)与 Spdlog c++ 库
- 函数 _main (OPENGL C++) 中引用的未解析的外部符号 ________
- 错误LNK2019未解析的外部符号"public: __thiscall SLinkList<char>::SLinkList<char>(void)"
- 使用静态 constexpr 成员的未解析外部符号
- 引入参数化构造函数后显示 LNK 2019 未解析外部符号的代码错误
- Dlib LNK2001未解析的外部符号USER_ERROR__consistent_build_configurati
- 矛盾的未解决的外部符号+未使用的库与VS2017和FFMPEG 4
- 链接器错误:切换到unicode生成给出:未解析的外部符号WinMain
- 类模板上一个特定函数的未解析外部符号
- LNK2001:未解析的外部符号public:static类std::vector