VsCode C语言 SDL包配置 2024.9

写这篇文章的起因是,最近我需要使用 SDL 包,我懒得下载V-studio ,所以直接在VsCode 里配置C环境。我搞了好几个小时,啥都弄好了,但是一直被下面几个问题缠绕导致demo启动不了,现在我记录一下这奇葩的解决过程。所有路径都是英文。

成功图:
在这里插入图片描述


前提条件:

  1. 配置好 C/C++ 编译器/调试器 MinGW_W64 自行百度
  2. 安装好 VsCode 里面的C++ 插件(紫色那个) C/C++ for Visual Studio Code
  3. 下载SDL2-devel-2.30.6-VC 并解压 ,文件夹内容如下:
    在这里插入图片描述
  4. 创建一个空文件夹作为项目文件夹:mySdl
  5. VsCode 打开 mySdl
  6. 配置好 .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\includeSDL2-2.30.6\lib\x64 两个文件夹里的文件直接复制到 mySdl 路径下:
在这里插入图片描述

.vscode 文件配置 :
然后配置tasks.jsonargs,从命令行里链接 头文件

//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[]) {
    // 初始化 SDL
    if (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;
}
### 设置SDL2用于VSCode中的C语言项目 #### 安装SDL2库 为了在VSCode中使用SDL2开发C程序,安装SDL2库是必要的。可以通过管理器来简化这一过程,在Linux上可以利用`apt-get`命令完成安装: ```bash sudo apt-get install libsdl2-dev ``` 对于Windows用户,则可以从官方网站下载适用于Windows平台的开发者版本[^1]。 #### 配置Visual Studio Code环境 配置IDE以便能够编译链接SDL2应用同样重要。这涉及到编辑`tasks.json`文件以及`c_cpp_properties.json`文件以指定正确的预处理器路径和其他选项。 - **更新 `includePath`** 为了让 IntelliSense 正确解析头文件,需向`.vscode/c_cpp_properties.json`内的`includePath`数组添加SDL2头文件的位置: ```json { "configurations": [ { ... "includePath": [ "${workspaceFolder}/**", "/usr/include/SDL2" ], ... } ] } ``` - **创建构建任务** 定义一个新的任务用来调用gcc/g++并传递适当参数给它,从而让其知道去哪里寻找静态或共享库(`LDFLAGS`)和对应的头文件(`CPPFLAGS`). 这些可以在`.vscode/tasks.json`里实现: ```json { "version": "2.0.0", "tasks": [ { "label": "build", "type": "shell", "command": "gcc", "args": [ "-g", "${file}", "`sdl2-config --cflags --libs`", // 使用`sdl2-config`脚本获取所需标志 "-o", "${fileDirname}/${fileBasenameNoExtension}" ], "group": { "kind": "build", "isDefault": true }, "problemMatcher": ["$gcc"], "detail": "Generated task to compile current file." } ] } ``` 上述JSON片段展示了如何通过执行`sdl2-config`工具来自动生成所需的编译期和运行时期参数[^3]. #### 测试设置是否成功 编写一段简单的测试代码验证一切正常工作。下面是一个基本的例子,该例子初始化了视频子系统,并打开了一个窗口显示“Hello World!”文字几秒钟后关闭。 ```c #include <SDL.h> #include <stdio.h> int main(int argc, char* argv[]) { if (SDL_Init(SDL_INIT_VIDEO) != 0){ printf("Unable to initialize SDL: %s\n", SDL_GetError()); return 1; } SDL_Window *win = SDL_CreateWindow("Test Window", 100, 100, 640, 480, SDL_WINDOW_SHOWN); if (!win){ printf("Could not create window: %s\n", SDL_GetError()); SDL_Quit(); return 1; } // Wait few seconds before quitting. SDL_Delay(5000); SDL_DestroyWindow(win); SDL_Quit(); return 0; } ``` 保存以上源码至`.c`文件内,接着按下Ctrl+Shift+B触发之前设定好的构建任务;如果没有任何错误发生的话,应该能看到生成的应用程序被执行并且弹出了预期的小窗体。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值