From:https://blog.csdn.net/u012570056/article/details/74639894
一,问题描述
MSVCRTD.lib(exe_winmain.obj) : error LNK2019: 无法解析的外部符号 WinMain,该符号在函数 "int __cdecl invoke_main(void)" (?invoke_main@@YAHXZ) 中被引用
CamShift.exe : fatal error LNK1120: 1 个无法解析的外部命令
error LNK2001: unresolved external symbol _WinMain
debug/main.exe:fatal error LNK 1120:1 unresolved externals
error executing link.exe;
二,原因及解决办法
产生这个问题的真正原因是c语言运行时找不到适当的程序入口函数,
一般情况下,如果是windows程序,那么WinMain是入口函数,在VS2017中新建项目为“win32项目”
如果是dos控制台程序,那么main是入口函数,在VS2017中新建项目为“win32控制台应用程序”
而如果入口函数指定不当,很显然c语言运行时找不到配合函数,它就会报告错误。
修改设置适应你的需求
如果是 windows桌面程序:
- 1. 菜单中选择 项目->属性, 弹出 项目 属性页
- 2. 在左边栏中依次选择:配置属性 -> C/C++ -> 预处理器,然后在右边栏的 预处理器定义对应的项中删除 _CONSOLE,添加 _WINDOWS
- 3. 在左边栏中依次选择:配置属性 -> 链接器 -> 系统,然后在右边栏的 子系统 对应的项改为Windows(/SUBSYSTEM:WINDOWS)
如果是 控制台程序:
- 1. 菜单中选择 项目->属性, 弹出 项目 属性页
- 2. 在左边栏中依次选择:配置属性 -> C/C++ -> 预处理器,然后在右边栏的 预处理器定义对应的项中删除 _WINDOWS,添加 _CONSOLE
- 3. 在左边栏中依次选择:配置属性 -> 链接器 -> 系统,然后在右边栏的 子系统 对应的项改为CONSOLE(/SUBSYSTEM:CONSOLE)
VS2019 需要将项目由 debug 改成 release
示例代码:
#include <windows.h>
LONG WINAPI WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
WNDCLASS wc;
HWND hwnd;
MSG msg;
wc.style = 0; //类样式
wc.lpfnWndProc = (WNDPROC)WndProc; //window 程序地址
wc.cbClsExtra = 0; //类 额外的字节
wc.cbWndExtra = 0; //window 额外的字节
wc.hInstance = hInstance; //实例句柄
wc.hIcon = LoadIcon(NULL, IDI_WINLOGO); //图标句柄
wc.hCursor = LoadIcon(NULL, IDC_ARROW); //鼠标句柄
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); // 背景颜色
wc.lpszMenuName = NULL; //菜单名
wc.lpszClassName = "MyWndClass"; //WNDCLASS 名
RegisterClass(&wc);
hwnd = CreateWindow(
"MyWndClass", //WNDCLASS 名
"SDK_Application", //window title
WS_OVERLAPPEDWINDOW, //window style
CW_USEDEFAULT, //水平位置
CW_USEDEFAULT, //垂直位置
CW_USEDEFAULT, //初始化宽度
CW_USEDEFAULT, //初始化高度
HWND_DESKTOP, //父窗口句柄
NULL, //菜单句柄
hInstance, //应用程序的 实例 句柄
NULL //window 创建数据
);
ShowWindow(hwnd, nShowCmd);
UpdateWindow(hwnd);
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
switch (message)
{
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
Ellipse(hdc, 0, 0, 200, 100);
EndPaint(hwnd, &ps);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}