MSVCRTD.lib(exe_main.obj) : error LNK2019: 无法解析的外部符号 main,函数 "int __cdecl invoke_main(void)" (?invoke_main@@YAHXZ) 中引用了该符号
时间: 2025-07-06 08:51:45 浏览: 12
### 解决 MSVCRTD.lib LNK2019 Unresolved External Symbol Main Invoke_Main
当遇到 `LNK2019` 错误提示关于未解析的外部符号 `main` 或者 `WinMain` 被函数 `"int __cdecl invoke_main(void)" (?invoke_main@@YAHXZ)` 引用时,这通常意味着编译器找不到程序入口点。对于控制台应用程序来说,这个入口通常是 `main()` 函数;而对于 Windows GUI 应用程序,则应该是 `WinMain()`。
#### 控制台应用配置修正
如果项目设置为构建控制台应用程序却缺少 `main` 函数定义,那么应该确保源文件中有如下形式的一个全局函数存在:
```cpp
#include <iostream>
// 定义 main 函数作为程序入口
int main(int argc, char* argv[]) {
std::cout << "Hello Console Application!" << std::endl;
return 0;
}
```
同时,在项目的属性页中确认以下选项正确无误:
- **链接器 -> 系统** 下面的子系统应设为“Console (/SUBSYSTEM:CONSOLE)”[^1]
#### Windows GUI 应用配置调整
如果是开发图形界面的应用而收到有关 `WinMain` 的错误消息,则需保证有适当版本的 `WinMain` 实现,并且项目属性已相应设定为目标为Windows应用程序而非控制台应用:
```cpp
#include <windows.h>
#include <tchar.h>
LRESULT CALLBACK WindowProcedure(HWND, UINT, WPARAM, LPARAM);
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow) {
// 初始化窗口类和其他资源...
MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return static_cast<int>(msg.wParam);
}
LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){
switch(message){
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd,message,wParam,lParam);
}
return 0;
}
```
同样重要的是要检查并修改项目属性中的某些字段来匹配GUI模式的需求:
- 将 **链接器->高级** 页面下的入口点留空让链接器自动选择默认值;
- 设置 **链接器 -> 系统** 子系统的值为“Windows(/SUBSYSTEM:WINDOWS)”[^2].
通过上述更改可以有效解决由于缺失合适入口点而导致的链接阶段失败问题。
阅读全文
相关推荐












