windows下c语⾔图形化gui编程踩坑记(环境:VScode)
我平时⽤的都是Mac和linux系统,但是⽆奈最近由于研究⽣复试需要的直播软件只能在windows上⾯跑,故被逼着⽤windows系统,⽽且只能在电脑前⾯等待⼀天轮到复试,复试内容是c语⾔。为了巩固c语⾔,我只能折腾windows上⾯的c语⾔编译器了。我了解的win上的c语⾔编译器如下:
1.MSVC编译器:这种编译器是微软⾃家开发的编译器,需要下载VS studio build tools 来安装,需要⽤到官⽅的Windows SDK,下载内容⽐较多,不够轻便。
去微软官⽅下载⽣成⼯具或者vs studio:
安装的时候勾选MSVC和windows SDK以及cmake⼯具即可
下载完成后会出现伪终端Developer Command promot for vs 2019
<编译器:这种编译器是gnu组织开发的免费⾃由软件,在windows上⾯主要有两种,⼀种是cygwin,⽀持posix,另⼀种是mingw,不⽀持posix,这⾥推荐的是mingw,下载的内容很少,配合VScode编程可以做很多轻量级运⽤。
vs编程软件需要注意的是同样的c语⾔代码在通过MSVC编译器和gcc编译器编译之后的结果是不⼀样的。
在这⾥我们下载mingw,⾸先会遇到⼀个问题,就是mingw分为两种,即32bit和64bit,每种都有对应的gcc和gdb,我们需要编译32bit 的程序的时候就要使⽤32bit版本的mingw,同理,64位也⼀样。为了解决这个问题,在linux上⾯的gcc和gdb都有对应的multilib版本,⽐如gdb-multilib。
但是根据mingw64的,gcc的multilib版本已经完成,但gdb的multilib还没有。
Support of multilib build in configure and in gcc. Parts are already present in gcc’s 4.5 version by using target triplet -w64-mingw32.
gdb – Native support is present, but some features like multi-arch support (debugging 32-bit and 64-bit by one gdb) are still missing features.
所以我们姑且先从sourceforge上⾯下载三个版本即gcc-multilib版本、gdb+gcc 32bit版本、gdb+gcc 64bit版本。
下载完成之后,跟往常⼀样,给gcc-multilib⾥的bin添加环境变量,注意最好不要给另外两个版本添加环境变量,不然可能会有冲突,要添加也是将环境变量path⾥⾯居于gcc-multilib⾥的bin之后。
之后新建⽂件夹,命名为test,打开该⽂件夹,在⾥⾯创建test.c
输⼊以下代码:
#include<windows.h>
const char g_szClassName[]="myWindowClass";
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_LBUTTONDOWN:
{
char szFileName[MAX_PATH];
HINSTANCE hInstance =GetModuleHandle(NULL);
GetModuleFileName(hInstance, szFileName, MAX_PATH);
MessageBox(hwnd, szFileName,"This program is:", MB_OK | MB_ICONINFORMATION);
}
break;
case WM_CLOSE:
DestroyWindow(hwnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine,int nCmdShow)
{
WNDCLASSEX wc;
HWND hwnd;
MSG Msg;
wc.cbSize =sizeof(WNDCLASSEX);
wc.style =0;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra =0;
wc.cbWndExtra =0;
wc.hInstance = hInstance;
wc.hIcon =LoadIcon(NULL, IDI_APPLICATION);
wc.hIcon =LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor =LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground =(HBRUSH)(COLOR_WINDOW+1);
wc.lpszMenuName =NULL;
wc.lpszClassName = g_szClassName;
wc.hIconSm =LoadIcon(NULL, IDI_APPLICATION);
if(!RegisterClassEx(&wc))
{
MessageBox(NULL,"Window Registration Failed!","Error!",
MB_ICONEXCLAMATION | MB_OK);
return0;
}
hwnd =CreateWindowEx(
WS_EX_CLIENTEDGE,
g_szClassName,
"The title of my window",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,240,120,
NULL,NULL, hInstance,NULL);
if(hwnd ==NULL)
{
MessageBox(NULL,"Window Creation Failed!","Error!",
MB_ICONEXCLAMATION | MB_OK);
return0;
}
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
while(GetMessage(&Msg,NULL,0,0)>0)
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return Msg.wParam;
}
这段代码只使⽤的windows.h这个头⽂件,注意这个头⽂件来⾃mingw,与是否安装windows sdk⽆关。之后使⽤vscode打开的时候选择debug
之后会有提⽰你,选择gdb即可
之后会⾃动根据你的环境变量设置⼀个launch.json⽂件,需要检查的是⾥⾯的gdb路径是否相符,假如你要调试的是64位程序,就需要你指定的gdb路径是对应64的。
之后返回test.c窗⼝(不然就是debug launch.json这个⽂件了,肯定会出错)重新点击debug,会报错让你创建task.json⽂件
选择configure task之后会让你选择编译器,这⾥需要注意的是msvc的编译器是cl.exe,我们要选不要选错了
在task.json中也要确保路径是对的。
这⾥默认编译的是64bit程序,如果你需要编译32位的程序,记得加上-m32参数,如果要调试的话,之前那个gdb也要改⼀下。。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论