写这篇文章的起因是,最近我需要使用 SDL 包,我懒得下载V-studio ,所以直接在VsCode 里配置C环境。我搞了好几个小时,啥都弄好了,但是一直被下面几个问题缠绕导致demo启动不了,现在我记录一下这奇葩的解决过程。所有路径都是英文。
成功图:
前提条件:
- 配置好 C/C++ 编译器/调试器 MinGW_W64 自行百度
- 安装好 VsCode 里面的C++ 插件(紫色那个) C/C++ for Visual Studio Code
- 下载SDL2-devel-2.30.6-VC 并解压 ,文件夹内容如下:
- 创建一个空文件夹作为项目文件夹:mySdl
- VsCode 打开 mySdl
- 配置好 .vscode 里的基本文件, 确保可以运行简单的 printf 函数
我遇到的奇葩问题:
- c 文件里无法引入 #include “SDL.h” 头文件
我试过修改他们说的配置文件:
//c_cpp_properties.json"includePath": ["${workspaceFolder}/**","${default}","你的路径\\SDL2-2.30.6\\include", //依旧找不到头文件"你的路径\\SDL2-2.30.6\\include\\**", //依旧找不到头文件"你的路径\\SDL2-2.30.6\\include\\", //依旧找不到头文件],
后来我他妈直接把 SDL2-2.30.6\include 和 SDL2-2.30.6\lib\x64 两个文件夹里的文件直接复制到 mySdl 路径下:
.vscode 文件配置 :
然后配置tasks.json 的 args,从命令行里链接 头文件
//tasks.json"args": ["-I", //此处链接SDL头文件"${workspaceFolder}\\include", //此处链接SDL头文件"-fdiagnostics-color=always","-L", //此处链接lib文件夹"${workspaceFolder}\\lib", //此处链接lib文件夹"-g","${file}","-o","${fileDirname}\\${fileBasenameNoExtension}.exe","-lSDL2main", //此处链接lib文件"-lSDL2" //此处链接lib文件],
配置之后莫名其妙的好了,但是我又遇到:
找不到 SDL2main 里的函数还是什么鬼东西
奇怪的要死,我明明已经配置好了系统环境变量 Path,我还重启了2次Vscode,一次电脑。
但就是没用,就是说找不到,于是我把环境变量直接删了。
妈了个巴子,它运行起来了
总结:
我的配置方式有些小众,总之就是把 include 使用 “-I” 引入,lib文件不需要环境变量。
以下是我的全部配置: 注意一下你的 MinGW_W64 路径即可
c_cpp_properties.json
{"configurations": [{"name": "Win32","includePath": ["${workspaceFolder}/**","${default}"// "${workspaceFolder}\\include"],"defines": ["_DEBUG","UNICODE","_UNICODE"],"cppStandard": "c++17","cStandard": "c11","compilerPath": "D:\\MinGW_W64\\mingw64\\bin\\g++.exe","intelliSenseMode": "gcc-x64"}],"version": 4
}launch.json{"version": "0.2.0","configurations": [{"type": "cppdbg","request": "launch","name": "Debug_g++.exe","program": "${fileDirname}\\${fileBasenameNoExtension}.exe","args": [],"stopAtEntry": false,"cwd": "${fileDirname}","environment": [],"externalConsole": false,"MIMode": "gdb","miDebuggerPath": "D:\\MinGW_W64\\mingw64\\bin\\gdb.exe","setupCommands": [{"description": "gbg启用整齐打印","text": "-enable-pretty-printing","ignoreFailures": true}],"preLaunchTask": "C/C++: g++.exe build active file"},{"name": "C/C++: gcc.exe 生成和调试活动文件","type": "cppdbg","request": "launch","program": "${fileDirname}\\${fileBasenameNoExtension}.exe","args": [],"stopAtEntry": false,"cwd": "${fileDirname}","environment": [],"externalConsole": false,"MIMode": "gdb","miDebuggerPath": "D:\\MinGW_W64\\mingw64\\bin\\gdb.exe","setupCommands": [{"description": "为 gdb 启用整齐打印","text": "-enable-pretty-printing","ignoreFailures": true},{"description": "将反汇编风格设置为 Intel","text": "-gdb-set disassembly-flavor intel","ignoreFailures": true}],"preLaunchTask": "C/C++: gcc.exe 生成活动文件"}]
}settings.json
{"C_Cpp.errorSquiggles": "disabled",
}tasks.json
{"tasks": [{"type": "cppbuild","label": "C/C++: gcc.exe 生成活动文件","command": "D:\\MinGW_W64\\mingw64\\bin\\gcc.exe","args": ["-I", //此处链接SDL头文件"${workspaceFolder}\\include", //此处链接SDL头文件"-fdiagnostics-color=always","-L", //此处链接lib文件夹"${workspaceFolder}\\lib", //此处链接lib文件夹"-g","${file}","-o","${fileDirname}\\${fileBasenameNoExtension}.exe","-lSDL2main", //此处链接lib文件"-lSDL2" //此处链接lib文件],"options": {"cwd": "${fileDirname}"},"problemMatcher": ["$gcc"],"group": {"kind": "build","isDefault": true},"detail": "调试器生成的任务。"}],"version": "2.0.0"
}
SDL — demo
// test.c
#include "SDL.h"// 定义游戏状态
enum GameState {RUNNING,GAME_OVER
};int main(int args, char *argv[]) {// 初始化 SDLif (SDL_Init(SDL_INIT_VIDEO) < 0) {return -1;}// 创建窗口SDL_Window *window = SDL_CreateWindow("SDL2 Game", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 800, 600, SDL_WINDOW_SHOWN);if (!window) {return -1;}// 获取窗口表面SDL_Surface *surface = SDL_GetWindowSurface(window);if (!surface) {return -2;}// 游戏对象SDL_Rect player;player.x = 700;player.y = 10;player.w = 20;player.h = 20;SDL_Rect enemy;enemy.x = 100;enemy.y = 200;enemy.w = 30;enemy.h = 30;enum GameState state = RUNNING;while (state == RUNNING) {SDL_Event event;while (SDL_PollEvent(&event)) {if (event.type == SDL_QUIT) {state = GAME_OVER;}}// 玩家移动逻辑const Uint8 *keystates = SDL_GetKeyboardState(NULL);if (keystates[SDL_SCANCODE_UP]) {player.y -= 5;}if (keystates[SDL_SCANCODE_DOWN]) {player.y += 5;}if (keystates[SDL_SCANCODE_LEFT]) {player.x -= 5;}if (keystates[SDL_SCANCODE_RIGHT]) {player.x += 5;}// 敌人移动逻辑enemy.x += 3;if (enemy.x > 800) {enemy.x = 0;}// // 检测碰撞// if ((player.x < enemy.x + enemy.w && player.x + player.w > enemy.x &&// player.y < enemy.y + enemy.h && player.y + player.h > enemy.y)) {// state = GAME_OVER;// }// 绘制玩家和敌人SDL_FillRect(surface, &player, SDL_MapRGB(surface->format, 180, 10, 140));SDL_FillRect(surface, &enemy, SDL_MapRGB(surface->format, 10, 200, 120));// 更新窗口表面SDL_UpdateWindowSurface(window);SDL_Delay((1.0 / 60) * 1000);}// 游戏结束时的清理SDL_FreeSurface(surface);SDL_DestroyWindow(window);SDL_Quit();return 0;
}