[IDE]VSCode+Premake5打造(c++)跨平台开发调试工具(3): VSCode编译和调试C++

不想看废话的话,直接上github:https://github.com/zhangping312/VSCode-Premake5-Example

    是时候开始表演真正的技术了,开玩笑的。这次的任务就是按照官网教程编译和调试C++工程。之前已经创建好了目录结构,现在只需要在Game/SFML/Source创建一个新的文件Main.cpp,代码很简单,就是用来调试使用。

#include <iostream>

int main(int args, char* argv[])
{
    std::cout << "Hello, World!" << std::endl;
    int i = 0;
    i += 5;
    std::cout << "i: " << i << std::endl;

    return 0;
}

    好了,C++代码这边全部结束了,可以开始展示程序员的基本功了:Ctrl + C, Ctrl + V。把VSCode官网上关于C++目录下的2篇文章的tasks.json内容拷贝过来就ok了。Microsoft C++ on WindowsClang on macOS

{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "dependsOn":[           // 任务依赖,在执行该任务前,需要先执行依赖任务
                "Create Bin folder"
            ],
            "label": "First task",  // 任务名称
            "type": "shell",        // 任务类型
            "group": "none",        // 组, 只有3个选项"build", "test", "none", 感觉功能就是用来简化选择用的
                                    //  build组: 通过Tasks: Run Build Task选择, 也可以通过Tasks: Run Task选择
                                    //  test组:  通过Tasks: Run Test Task选择, 也可以通过Tasks: Run Task选择
                                    //  none组:  通过Tasks: Run Task选择,就是显示全部任务
            "command": "echo",      // 命令
            "args": [               // 命令参数
                "Hello, World!"
            ]
        },

        /
		// # Creating
        /

        // ## Mac need to create bin folder
        {
            "label": "Create Bin folder",
            "type": "shell",
            "group": "none",
            "windows":{             // Window命令
                "command": "mkdir",
                "args": [
                    "-p",
                    "bin/${input:buildProject}",
                    ";", // PowerShell command, 不能用"&&"
                    "echo",
                    "Create BIN folder."
                ],
            },
			"osx": {                // Mac命令
                "command": "mkdir",
                "args": [
                    "-p",
                    "bin/${input:buildProject}",
                    "&&", 
                    "echo",
                    "Create BIN folder."
                ]
            },
            "options": {
                "cwd": "${workspaceFolder}/../"     // 指定当前的工作文件夹
            },
        },

        /
		// # Cleaning
        /

        // ## Clean build files
		{
            "label": "Clean Build folder",
            "type": "shell",
            "group": "none",
			"windows": {
                "command": "Remove-Item",
                "args": [
                    "build",
                    "-Recurse",
                    "-Force",
                    "-Confirm:$false",
                    ";", 
                    "echo",
                    "Cleaning Build folder."
                ]
			},
			"osx": {
				"command": "rm -f -r build && echo Cleaning Build folder."
			},
            "options": {
                "cwd": "${workspaceFolder}/../"
            },
        },
		// ## Clean bin files
		{
            "label": "Clean Bin folder",
            "type": "shell",
            "group": "none",
			"windows": {
                "command": "Remove-Item",
                "args": [
                    "bin*",
                    "-Recurse",
                    "-Force",
                    "-Confirm:$false",
                    ";", 
                    "echo",
                    "Cleaning BIN folder."
                ]
			},
			"osx": {
				"command": "rm -f -r bin* && echo Cleaning BIN folder."
			},
            "options": {
                "cwd": "${workspaceFolder}/../"
            },
        },

        /
		// # Project files build
        /

        // ## Windows
        {
            "dependsOn":[
                "Clean Bin folder",
                "Create Bin folder"
            ],

            "label": "Build (Windows)",
            "type": "shell",
            "group": "build",
            "command": "cl.exe",
            "args": [
                "/Zi",
                "/EHsc",
                // 不要写成"/Fo",  "${workspaceFolder}\\..\\bin\\${input:buildProject}\\"
                // 导致运行时会在/Fo后加上空格,导致设置失败,如果真要写,可以在/Fo后加上:参考下面注释的设置
                "/Fo${workspaceFolder}\\..\\bin\\${input:buildProject}\\",  // 设置obj文件所在目录,
                // 正确设置
                //"/Fo:",
                //"${workspaceFolder}\\..\\bin\\${input:buildProject}\\",
                "/Fd${workspaceFolder}\\..\\bin\\${input:buildProject}\\",  // 设置pdb文件所在目录
                "/FC",
                "${workspaceFolder}\\${input:buildProject}\\Source\\*.cpp", // 设置代码所在目录
                "/Fe:",
                "${workspaceFolder}\\..\\bin\\${input:buildProject}\\${input:buildProject}.exe" // 设置exe所在目录
            ],
            "problemMatcher": ["$msCompile"]//捕捉编译时编译器在终端里显示的报错信息
        },
        // ## Mac
        {
            "dependsOn":[           // 任务依赖,在执行该任务前,需要先执行依赖任务
                "Clean Bin folder",
                "Create Bin folder"
            ],

            "label": "Build (Mac)",
            "type": "shell",
            "group": "build",
            "command": "/usr/bin/clang++",
            "args": [
                "-std=c++17",
                "-stdlib=libc++",
                "-g",
                "${workspaceFolder}/${input:buildProject}/Source/*.cpp",    // 设置代码所在目录
                "-o",
                "${workspaceFolder}/../bin/${input:buildProject}/${input:buildProject}"           // 设置可执行文件所在目录
            ],
            "options": {
              "cwd": "${workspaceFolder}"
            },
            "problemMatcher": ["$gcc"]
        }
    ],

    "inputs": [
        {
            "id": "buildProject",                       // 标识
            "description": "Select project to build:",  // UI上的描述
            "default": "SFML",                          // 默认值
            "type": "pickString",                       // 类型,只有3个选项"promptString", "pickString", "command"
            "options": ["SFML", "Test"]                 // 选项
        }
    ]
}

    再进行修改一下,就可以生成可执行文件了。在Windows上,直接运行会编译失败,显示这个错误:

    可以通过添加环境变量来解决这个问题,但是在32位和64位切换有点麻烦。因此可以通过另一个方法:在开始菜单找到Visual Studio 2019, 通过"x64_x86 Cross Tools Command Prompt for VS 2019"或者"x86_x64 Cross Tools Command Prompt for VS 2019"来打开VSCode,这样就可以编译了。
    因为前期做好了目录结构,我们可以在VSCode-Premake5-Example/bin/SFML文件夹下找到SFML.exe文件(Windows)和SFML(Mac),拖到终端中执行,得到如下结果:

    编译和执行都没问题,现在开始调试。需要创建launch.json文件,可以按照官网上的步骤在Run按钮下选择Add Configuration...,也可以通过Ctrl + Shift + P快捷键, 输入Debug: Select and Start Debugging, 选择Add Configuration...来完成。Mac上只有一个C++(GDB/LLDB)选项,随便选,反正都是要改的。

    修改launch.json文件,都有注释,不再介绍,不懂官网或者google了解。launch.json文件中也有inputs参数,因为tasks.json不能和launch.json文件共享inputs参数,所以将之拷贝过来。

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        // ## Windows
        {
            "name": "Launch (Windows)",         // 配置名称,VSCode下面
            "program": "${workspaceFolder}\\..\\bin\\${input:buildProject}\\${input:buildProject}.exe",// 需要调试的程序路径
            "preLaunchTask": "Build (Windows)", // 调试开始前执行的任务,我们在调试前要编译构建。与tasks.json的label相对应,名字要一样
            "type": "cppvsdbg",                 // 配置类型
            "request": "launch",                // 请求配置类型,可以为launch(启动)或attach(附加)
            "args": [],                         // 程序调试时传递给程序的命令行参数,这里设为空即可
            "stopAtEntry": true,                // 选为true则会在打开控制台后停滞,暂时不执行程序
            "cwd": "${workspaceFolder}",        // 当前工作路径:当前文件所在的工作空间
            "environment": [],                  // 环境变量
            "externalConsole": false            // 为true时使用单独的cmd窗口,跳出小黑框;设为false则是用vscode的内置终端,建议用内置终端
        },

        // ## Mac
        {
            "name": "Launch (Mac)",
            "program": "${workspaceFolder}/../bin/${input:buildProject}/${input:buildProject}",
            "preLaunchTask": "Build (Mac)",
            "type": "cppdbg",
            "request": "launch",
            "args": [],
            "stopAtEntry": true,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,

            "MIMode": "lldb"                    // 指定连接的调试器
        }
    ],

    "inputs": [
        {
            "id": "buildProject",                       // 标识
            "description": "Select project to launch:", // UI上的描述
            "default": "SFML",                          // 默认值
            "type": "pickString",                       // 类型,只有3个选项"promptString", "pickString", "command"
            "options": ["SFML", "Test"]                 // 选项
        }
    ]
}

    运行结果:

    至此VSCode编译和调试C++都已经结束了,以上功能都可以在Windows和Mac上测试,基本上VSCode这边都已经讲的差不多了,还差一个c_cpp_properties.json文件没有说,因为现在是单个cpp文件,也没有用到第3方,所以暂时还用不上,到SFML测试的时候会用上。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值