vscode 配置opengl (glut), lib链接可参考

这里假定你已经配置好基础的vscode c++环境

json介绍

这里其实主要配置的3种json, vscode其实就是通过launch.json和tasks.json来自动生成指令的

  • launch.json

这个用于启动程序用的,但是由于其可以指定preLaunchTask-即在启动之前需要做什么事情,所以这里用来启动编译-链接到最后启动程序等一系列过程

我们可以看到图中左上角,每一个启动方式(c/c++ Runner:Debug Session和c/c++ glut)其实都对应"configurations"数组中的一个json的name属性

而在这里,我们启动了cmd(program),让cmd去调用我们生成好的程序(args),并且调用完成后再调用pause指令,我们通过preLaunchTask所指向的task完成程序的编译等操作

  • tasks.json

本json中就存放了各种task,每个task都对应一个json,而preLaunchTask就是通过这里每个json的label属性来找是哪个task,这里我们就让task去做3件事情:1.编译,2.链接,3.复制dll

  • c_cpp_properties.json

这个json和程序生成与运行无关,他是用来配置intellisense,这个配置错了,你写代码会有报错,但是编译和生成这些还是正常的,一般就需要注意一下standard和includePath就行

配置freeglut

  • 下载完毕选择一个地方安装解压即可

其中

bin中的dll是运行时需要的

include是编译时需要的,包含目录

lib是连接是需要的,库目录

修改task.json

  • 这里主要通过command后面的指令+args中的参数组成一整个命令行语句然后调用
  • 此外,通过dependsOn 来构成task之间的依赖

创建编译任务 compile

  • 这里command为你的g++.exe的路径,若你将g++的目录添加到了环境变量中,则可以直接使用g++
  • 而args就是各个编译参数:

-I<Include_path>引入包含文件夹,用于编译

-c 指定编译源文件,-o 指定输出的文件,这里生成中间文件.o

  • 可参考代码如下
json 复制代码
 {
            "type": "cppbuild",
            "label": "glut compile",
            "command": "E:/MinGW/bin/g++.exe",
            "args": [
                "-IE:\\CPP\\OpenGL\\freeglut-MinGW-3.0.0-1.mp\\freeglut\\include",
                "-fdiagnostics-color=always",
                "-g3",
                "-c",
                "${file}",
                "-o",
                "${fileDirname}\\${fileBasenameNoExtension}.o",
                "--std",
                "c++17",
            ],
            "options": {
                "cwd": "E:/MinGW/bin"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "detail": "调试器生成的任务。"
        },
  • 类似编译,这里同样command为g++,只是args变成链接的参数了,具体为g++ x.o -o y.exe,将x.o链接生成y.exe
  • 那这里既然要链接,就要引入库目录,对应lib目录,指令:-L<lib_path>, 同时要引入库, 指令: -l<lib_name>, 这里lib_name注意不要前面的lib
  • 同时这里本人踩了大坑,g++编译时, -l<lib_name> 必须要放在源文件后面,推荐直接放最后面,不然它还是链接不上
  • 同时你链接需要.o,所以该task, "dependsOn": ["glut compile"] (上一节的名字)
  • 可参考代码如下:
json 复制代码
{
            "type": "process",
            "label": "glut link",
            "command": "E:/MinGW/bin/g++.exe",
            "args": [
                "-fdiagnostics-color=always",
                "-g3",
                "${fileDirname}\\${fileBasenameNoExtension}.o",
                "-o",
                "${fileDirname}\\${fileBasenameNoExtension}.exe",
                "--std",
                "c++17",
                "-LE:\\CPP\\OpenGL\\freeglut-MinGW-3.0.0-1.mp\\freeglut\\lib\\",
                "-lopengl32", "-lglu32", "-lfreeglut",
            ],
            "options": {
                "cwd": "E:/MinGW/bin"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "detail": "调试器生成的任务。",
            "dependsOn": ["glut compile"]
        },

创建移动lib任务 setup

  • 最后要将dll移动到你生成exe的目录下
  • 这里我们使用xcopy指令,注意command
  • 同时"dependsOn": ["glut link"]
  • 参考代码如下:
json 复制代码
{
            "type": "process",
            "label": "glut setup",
            "command": "xcopy",
            "args": [
                "/y",
                "/d",
                "E:\\CPP\\OpenGL\\freeglut-MinGW-3.0.0-1.mp\\freeglut\\bin\\freeglut.dll",
                "${fileDirname}\\"
            ],
            "options": {
                "cwd": "E:/MinGW/bin"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "detail": "调试器生成的任务。",
            "dependsOn": ["glut link"]
        },

修改launch.json

  • 最后在launch.json 添加我们的启动json即可
  • 启动的程序为cmd.exe
  • 然后args, 通过cmd调用我们生成的exe,并最后pause
  • 通过 "preLaunchTask": "glut setup" 来调用我们的task链条
  • 参考代码:
json 复制代码
 {
      "name": "C/C++ glut",
      "type": "cppdbg",
      "request": "launch",
      "stopAtEntry": false,
      "externalConsole": true,
      "cwd": "e:/CPP/testVsCode",
      "program": "C:\\Windows\\System32\\cmd.exe",
      "args":[
        "/C", 
        "${fileDirname}\\${fileBasenameNoExtension}.exe", 
        "&",
        "pause"],
      "MIMode": "gdb",
      "miDebuggerPath": "gdb",
      "setupCommands": [
        {
          "description": "Enable pretty-printing for gdb",
          "text": "-enable-pretty-printing",
          "ignoreFailures": true
        }
      ],
      "preLaunchTask": "glut setup"
    }
  • 最后找到对应位置即可编译生成啦

补充

  • vscode运行c++时,若想运行在独立控制窗口,那么为了避免窗口瞬间关闭看不到输出,可以使用cmd来调用程序,但是这样会命中不了断点。若想命中断点,且能看到输出,要不用内置控制台,要不在代码末尾补个getchar()
相关推荐
愿天垂怜3 分钟前
【C++】C++11引入的新特性(1)
java·c语言·数据结构·c++·算法·rust·哈希算法
大帅哥_9 分钟前
访问限定符
c语言·c++
wmd1316430671224 分钟前
IDEA插件CamelCase,快速转变命名格式
java·ide·intellij-idea
小林熬夜学编程39 分钟前
【Linux系统编程】第五十弹---构建高效单例模式线程池、详解线程安全与可重入性、解析死锁与避免策略,以及STL与智能指针的线程安全性探究
linux·运维·服务器·c语言·c++·安全·单例模式
凯子坚持 c1 小时前
C++之二叉搜索树:高效与美的极致平衡
开发语言·c++
埋头编程~1 小时前
【C++】踏上C++学习之旅(十):深入“类和对象“世界,掌握编程黄金法则(五)(最终篇,内含初始化列表、静态成员、友元以及内部类等等)
java·c++·学习
亚图跨际1 小时前
MATLAB和C++及Python流式细胞术
c++·python·matlab·流式细胞术
海绵波波1071 小时前
C++11:多线程编程
c++
程序猿阿伟1 小时前
《进程隔离机制:C++多进程编程安全的坚固堡垒》
服务器·c++·安全
gkdpjj2 小时前
C++优选算法十四 优先级队列(堆)
开发语言·数据结构·c++·算法