C++调用graphics.h编译报initwindow、WinMain未解析外部符号错误
报错根因
两个链接错误分别对应不同的配置问题,同时你的代码本身也存在逻辑问题:
unresolved external symbol WinMain referenced in function "int __cdecl invoke_main(void)":创建项目时误选了Windows GUI应用类型,这类项目要求入口函数为WinMain,但你写的是控制台程序的入口main,链接器找不到匹配的入口函数就会抛出该错误。unresolved external symbol initwindow:属于典型的链接阶段找不到函数实现的错误。你将graphics.h单独放在桌面的操作是错误的:头文件仅提供函数声明,initwindow这类绘图接口的实际实现存放在图形库对应的.lib、.dll文件中。你既没有将头文件路径加入编译器的包含搜索目录,也没有配置库文件搜索路径和链接依赖项,链接器自然找不到函数的实现代码。- 代码逻辑隐患:你定义了全局变量
HDC hdc但从未对其赋值,initwindow执行成功后会返回窗口对应的绘图上下文句柄,你没有接收该返回值就直接将未初始化的hdc传入Rectangle,就算编译通过运行时也会触发内存访问错误崩溃。
解决步骤
- 重建正确类型的项目
如果你用的是Visual Studio系列IDE,新建项目时选择控制台应用模板,不要选择Windows桌面应用、Win32项目等GUI类项目模板,从入口函数配置上解决WinMain找不到的问题。 - 正确配置graphics.h对应的图形库
目前Windows平台下使用graphics.h基本都是搭配EasyX图形库(原版Turbo C的BGI库早已停止维护,无法在现代编译器下运行):- 不要手动将
graphics.h放在桌面,直接下载对应你IDE版本的EasyX安装包运行,安装程序会自动配置头文件搜索路径、库文件搜索路径和链接依赖,不需要手动修改路径配置。 - 如果你使用的是手动分发的WinBGI等其他graphics.h实现,需要手动在项目属性中配置:将存放
graphics.h的文件夹路径添加到C/C++ -> 常规 -> 附加包含目录,将存放对应.lib文件的文件夹路径添加到链接器 -> 常规 -> 附加库目录,再将用到的.lib文件名(比如libbgi.a、easyx.lib)添加到链接器 -> 输入 -> 附加依赖项。
- 不要手动将
- 修正代码逻辑
修正句柄未赋值的问题,参考可运行代码如下:
注意:如果使用EasyX库,官方推荐直接使用库内置的绘图函数(比如#include "graphics.h" int main() { // 初始化绘图窗口,宽400高300 initwindow(400, 300); // 获取当前窗口的绘图上下文句柄 HWND hwnd = GetForegroundWindow(); HDC hdc = GetWindowDC(hwnd); for (int i = 0; i < 300; i++) { Rectangle(hdc, 100 + i, 100, 300, 300); } getch(); // 释放资源、关闭绘图窗口 ReleaseDC(hwnd, hdc); closegraph(); return 0; }rectangle),不需要手动获取HDC调用Windows原生GDI函数,可以减少句柄操作的错误。
内容的提问来源于stack exchange,提问作者Transformers
相关产品推荐
相关产品推荐

