Linux C/C++ 配置开发项目

Xmake实战---xmake 与 vscode 集成环境使用 阅读详情
AI摘要

本文基于Linux开发环境,介绍了vscode、xmake、git的使用方法。包括项目版本管理、工程创建、编译调试、部署,以及构建调试运行的配置、数据结构Visualizers设置和intellisense配置等内容,也提及了Windows环境下的相关操作及遇到的问题。

序

本文档是基于linux开发环境进行编写,也同样适用于window开发环境。

本文仅是介绍 vscode、xmake 的一种使用方法。 xmake本身也是支持远程编译,相比ssh更加稳定、高效。

学习源码 : https://gitcode.com/xiaofeio/stu_linux/overview

介绍

  • vscode、xmake、git 使用

  • 通过 xmake 配置项目工程(目标)依赖

  • 配置 vscode,实现快捷构建任务(习惯了vs2013的快捷方式)、构建依赖(非xmake的配置)、IntelliSense功能(代码分析、代码补全),调试程序的参数配置,附加进程调试,调试器自定义结构的Visualizers

系统环境

操作系统 CentOS 9 Stream

工作环境 vscode、gcc、xmake、git

项目版本管理

创建git版本库

  1. 登录GitCode - 全球开发者的开源社区,开源代码托管平台

  2. 点击右侧 新建 按钮创建一个 stu_linux 项目(可自行命名)

    在这里插入图片描述

  3. 创建完成进程项目代码后点击 Clone 按钮

    在这里插入图片描述

  4. 弹出的页面中选择 SSH ,点击标记2复制url路径

    在这里插入图片描述

    克隆git仓储

    请参考《Linux C/C++ 编程环境配置》配置版本管理部分,配置 ssh 参考 第4条、第5条, 克隆仓储参考 第6条,完成后如下图所示

    在这里插入图片描述

创建项目工程

先 不要创建 代码工程,规划不会为每个学习用例都创建一个仓储,而是都放在这一个仓储下(根据个人规划可跳过下面这几步,通过 vscodeXMake:CreateProject 命令创建工程也会失败,提示不是一个空文件夹)。

在这里插入图片描述

在这里插入图片描述

方法一

  1. 首先创建一个 eg_prjs 的用例,在终端中输入

    mkdir eg_prjs
    

    在这里插入图片描述

  2. 在vscode中选择打开 eg_prjs 文件夹

    在这里插入图片描述

    在这里插入图片描述

  3. 通过 vscode XMak:CreateProject 创建项目工程

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    需要注意的是vscode XMake:CreateProject 创建了 .vscode 文件夹

方法二

  1. 通过 xmak 命令行的方式创建 ex_prjs 共享库,进入到 ex_prjs 文件夹下,通过命令行的方式可以正常编译

    注: 为了区分方法一命名为 ex_prjs
    在这里插入图片描述

    但是不能使用vscode中 XMake:Build 命令构建

    在这里插入图片描述

    提示如下没有找到 xmake.lua,这是因为 vscode xmake 插件的命令会直接作用在顶级目录上,还是需要切换vs code的工作目录

    在这里插入图片描述

  2. 在vscode中通过打开 ex_prjs 文件夹方式切换vscode的工作空间

    在这里插入图片描述

    在这里插入图片描述

    需要注意的是没有 .vscode 文件夹,这并不影响后面的配置,可以添加回来。

    相比 方法一 缺少了 compile_commands.json 文件,通过输入下列命令

    xmake project -k compile_commands
    

    会生成 compile_commands.json 文件

    在这里插入图片描述

    在根目录下创建 .vscode 文件夹,并把 compile_commands.json 文件移动(vscode中直接拖拽)到 .vscode 文件夹下就和方法一样了

    在这里插入图片描述

    .xmake 文件夹下内容随着后期使用自然会明白的,虽然和 方法一 有些不一样,但这不影响本次实验,后面的操作都是相同的。

编译调试项目

注: 沿用 创建项目工程的 方法一

在这里插入图片描述

提交代码

在进行下列演练之前,先提交代码并上传到 远端仓储

  1. 点击导航中 Source Control,在切换 SOURCE CONTROL界面上点击提交,查看变更信息,书写日志,提交代码

在这里插入图片描述

在这里插入图片描述

​ 点击”提交“按钮弹出确认对话框,点击”Save“

在这里插入图片描述

​ 只是完成了本地的提交

  1. 同步推送到远端仓储,点击”Sync Changes“

    在这里插入图片描述

    在弹出的确认对话中点击”OK“或"OK, Don’t Show Again"

    在这里插入图片描述

    提交成功后, Source Control 界面更新控件状态

    在这里插入图片描述

    查看远端仓储,如果一直打开了远端仓储界面,按下浏览器上的 F5刷新一下

    在这里插入图片描述

    查看到提交信息

编译工程

编译前先了解下各个文件和文件内容

  1. xmake.lua,这是本节中的一个重要文件
    在这里插入图片描述

    这个文件是 xmake 的配置文件,含义参考图中的描述,创建默认是没有这些说明。 xmake是基于 lua 开发的,注释可以用 – ,为了保留原样没加注释。

    重要的一句是 add_deps(“foo”) 表示 eg_prjs 目标(或称为应用程序)依赖了 foo 目标(或称为模块)。

  2. foo.h

    在这里插入图片描述

    这里重要的一句是导出 add(int a, int b) 函数

    __export int add(int a, int b);
    

    C/C++编程人员都懂的,foo.cpp 的内容不想就知道是什么了,这里就不在说明了。

  3. main.cpp

    在这里插入图片描述

    很好,foo.h没有红色的波浪线等情况,这是因为foo.h、foo.cpp、main.cpp都在一个src的文件夹下

  4. 使用 vscode xmake 插件中的命令构建编译项目工程。注没有编译无法启动调试(后面会讲解如何配置满足个人习惯)

    在这里插入图片描述

    执行 XMake:Build
    命令,终端一共执行两条 xmak 命令,分别是

    xmake f -p linux a x86_64 -m debug
    

    这句用于配置平台、架构、debug模式

    xmake
    

    这句用于构建编译。

    出现了 build ok 表示构建成功,花费 1.077 秒。

运行和调试

运行

通过点击 xmake 工具栏上 运行 按钮就可以启动运行,效果如下

在这里插入图片描述

首先会执行 xmake run eg_prjs 命令启动运行, 程序运行后main.cpp中调用了foo.h中的 add()函数进行计算并打印计算结果。

既然已经知道了 xmake 插件在vscode中的执行也是基于 xmake 本身提供的命令集进行操作,那么自然也可以通过输入命令行的方式进行 运行 同样也适用 调试

在这里插入图片描述

在命令终端中直接输入 xmake run 即可运行, 与上一个比少输入了一个eg_prjs(因为这个下面下就一个可执行目标可以忽略,关于xmake的用法请参考官网说明)

调试

简单调试

首先在main.cpp中第5行按下快捷键 F9 打一个断点

在这里插入图片描述

然后点击上图的标记2运行 debug 启动调试

在这里插入图片描述

调试程序启动后,会停在断点处,并且显示标记2的 调试操作命令(可执行单步调试,进入、跳出、停止、重启),在标记3可以看到变量信息,调用堆栈。

按下 F11 进入到 foo.cpp 的 add()函数

接下来修改一下main.cpp的函数

#include "foo.h"
#include <iostream>
#include <string>
#include <vector>

int main(int argc, char** argv) {
    std::cout << "add(1, 2) = " << add(1, 2) << std::endl;

    std::vector<std::string> stdvec = { "Hello", "vscode", "xmake", "C/C++", "!!!" };
    for (auto &&i : stdvec)
    {
        std::cout  << i << " ";
    }
    std::cout << std::endl;
    


    return 0;
}

在第7行再次按下快捷键 F9 去掉第7断点, 在main.cpp中第10行按下快捷键 F9 打一个断点,然后再启动调试(可以直接按下 F5 弹出的命令面板中选择 xmake)

在这里插入图片描述

当程序停止在断点处,在右侧变量查看区,点击 stdvec 右侧展开按钮,可以看到 vector 容器内容的各个元素值。

项目工程部署

在创建项目工程中,可以看到通过 xmake 命令创建的工程是一个简单框架目录部署结构,而在实际开发中会根据不同的应用场景进行更复杂的目录部署。

调整文件部署结构

接下来以foo、app两个文件夹分别作为独立模块的存储文件夹为例。将目录调整如下结构。

在这里插入图片描述

foo文件夹下的inc文件夹用于对外提供的头文件,而src文件作为foo模块内部的源码文件。

app文件夹用于存放应用程序的源文件,由于app并不对外提供头文件,因此没有部署inc、src等相应功能的文件夹。

修改 xmake 配置、编译和调试

接下来打开 xmake.lua 文件,修改内容如下

add_rules("mode.debug", "mode.release")

target("foo")
    set_kind("shared")
    add_files("src/foo/src/**.cpp")  -- ** 表示添加 src/foo/src文件夹及子文件夹夹下的所有.cpp文件

target("eg_prjs")
    set_kind("binary")
    add_deps("foo")
    add_files("src/app/*.cpp") -- * 表示添加 src/app文件夹下的所有cpp文件

修改完成后编译一下看看会是什么情况

在这里插入图片描述

结果显示 没有找到 foo.h 这个文件,并且是因为编译 foo.cpp 在第1行第10列报的错误。

因为编译是基于 xmake, 因此只需要继续修改 xmake.lua 文件即可, 更多的信息请参考 xmake教程 ,修改内容如下。

add_rules("mode.debug", "mode.release")

target("foo")
    set_kind("shared")
    add_includedirs("src/foo/inc")   -- 添加头文件的目录
    add_files("src/foo/src/**.cpp")  -- ** 表示添加 src/foo/src文件夹及子文件夹夹下的所有.cpp文件

target("eg_prjs")
    set_kind("binary")
    add_deps("foo")
    add_files("src/app/*.cpp") -- * 表示添加 src/app文件夹下的所有cpp文件

再次构建看看效果

在这里插入图片描述

还是有错误,只不过报告的错误是 main.cpp 在第1行第10列报的错误。那么继续修改 xmake.lua 文件,内容如下

add_rules("mode.debug", "mode.release")

target("foo")
    set_kind("shared")
    add_includedirs("src/foo/inc", {public = true })   -- 添加头文件的目录, public表示把头文件暴露出来提供给通过 add_deps() 添加代模块, 如下面的 add_deps(fool)
    add_files("src/foo/src/**.cpp")  -- ** 表示添加 src/foo/src文件夹及子文件夹夹下的所有.cpp文件

target("eg_prjs")
    set_kind("binary")
    add_deps("foo")
    add_files("src/app/*.cpp") -- * 表示添加 src/app文件夹下的所有cpp文件

再次构建,可以看到编译成功

在这里插入图片描述

启动调试

在这里插入图片描述

查看调试效果

在这里插入图片描述

和之前的调试效果是一样的

构建调试运行

配置构建任务

习惯了使用Vistual Studio 2013等系列的IDE,按下 Ctrl + Shift + B 进行构建程序,而vscode 会弹出命令面板, 并且根据当前打开的文件显示的命令也不同,打开的是cpp文件显示效果如下

在这里插入图片描述

如果当前文件是 .json 格式,显示如下

在这里插入图片描述

虽然可以通过设置 xmake 的快捷键是 Ctrl + Shift + B,但这样也会丢失了vscode 的Ctrl + Shift + B灵活行。可以参考vscode官网 Get Started with C++ on Linux in Visual Studio Code配置tasks.json方法。

下面来通过配置tasks.json达到使用 Ctrl + Shift + B 快捷键的方法

关闭 所有打开的文档,点击 Terminal - Configure Tasks…

在这里插入图片描述

弹出的命令面板中 点击 Create tasks.json file from template

在这里插入图片描述

点击 Others Example to run an arbitrary extemal command

在这里插入图片描述

会在 .vscode 文件夹下自动创建 tasks.json 文件,并自动打开

在这里插入图片描述

修改配置文件的内容如下然后保存

{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "label": "xmake-b",           // 显示的名称
            "type": "shell",              // 脚本任务
            "command": "xmake",           // 指定运行的命令
            "args": [                     // xmake 命令行的参数
                "-v"                      // 打印详细, 根据个人习惯是否添加. 详细说明请参考xmake官方文档说明
            ],
            "group": {
                "kind": "build",         // 添加到构建分组中, 用于在命令面板中显示 
                "isDefault": false       // 默认是 false, 设置为true后, 按下快捷键 Ctrl + Shift + B 后, 不弹出命令面板直接运行该任务
            }
            
        }
    ]
}

避免xmake 构建的缓存影响查看的效果,先在终端中运行下面的命令,清空构建缓存

xmake clean
clear

在这里插入图片描述

清理完构建的缓存后,按下 Ctrl + Shift + B 快捷键,弹出的命令面板中显示tasks的任务列表,可以看到刚刚配置的 xmake-b 任务

在这里插入图片描述

点击 xmake-b 任务,

在这里插入图片描述

可以看到执行任务的构建命令 xmake -v,然后是编译的详细信息,如果不设置 -v 参数就和前面的构建输出信息一致。关于参数请查看 xmake 教程。

有时希望在构建任务前先执行一些其他事情,类似vs2013的构建前事件。比如在构建前先自动清理后再构建,那么可以在 task.json 文件中通过添加其他任务(也就是配置多任务都在 task.json 文件中), 然后通过 dependsOn 配置依赖的其他任务。 拷贝下面代码并粘贴 task.json 文件中

{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "label": "xmake-b",           // 显示的任务名称
            "type": "shell",              // 脚本任务
            "command": "xmake",           // 指定运行的命令
            "args": [                     // xmake 命令行的参数
                "-v"                      // 打印详细, 根据个人习惯是否添加. 详细说明请参考xmake官方文档说明
            ],
            "group": {
                "kind": "build",          // 添加到构建分组中, 用于在命令面板中显示 
                "isDefault": false        // 默认是 false, 设置为true后, 按下快捷键 Ctrl + Shift + B 后, 不弹出命令面板直接运行该任务
            },
            "dependsOn":[                 // 构建前先执行其他依赖任务集. 
                "stu-echo",               // stu-echo 显示 Hello task for echo!!!
                "xmake-c"                 // 执行 xmake-c 任务清理构建缓存
            ],           
        },
        {
            "label": "xmake-c",           // 显示的任务名称
            "type": "shell",              // 脚本任务
            "command": "xmake",           // 指定运行的命令
            "args": [                     // xmake 命令行的参数
                "c"                       // 清理构建缓存
            ],
            "group": "build",             // 添加到构建分组中, 用于在命令面板中显示
        },
        {
            "label": "stu-echo",          // 显示的任务名称
            "detail": "显示输出字符",      // 详细信息
            "type": "shell",              // 脚本任务
            "command": "echo",            // 指定运行的命令
            "args": [                     // echo 命令行的参数
                "Hello task for echo!!!"  // 显示 Hello task for echo!!!
            ],
            //"group": "build",           // 去掉分组, 表示这个任务不会出现在命令面板的构建列表中
        }
    ]
}

粘贴保存后再次 按下 Ctrl + Shift + B 快捷键,在命令面板的任务列中可以看到 xmake-b、 xmake-c 两个任务

在这里插入图片描述

选择 xmake-b 并执行

在这里插入图片描述

这里并没有看到显示 Hello task for echo!!! 信息,原因是执行 xmake 的命令创建了一个新的输出面板,原文的翻译 终端将被任务重新使用,按任意键将其关闭。按任意键后,可以看到执行了 stu-echo 并输出 Hello task for echo!!! 信息

在这里插入图片描述

配置运行调试

虽然通过按 F5快捷键或 xmake 工具栏 上的 debug 按钮可以启动调试,但是不能解决代码改变后自动编译后再运行调试。可以通过配置运行任务增加前置任务来解决。

点击 Run - Add Configuration

在这里插入图片描述

在弹出的命令面板中选择并点击 xmake

在这里插入图片描述

在 .vscode 文件夹下自动创建 launch.json 文件,并自动打开

在这里插入图片描述

打开 main.cpp 并增加输出 Hello launch.json

#include "foo.h"
#include <iostream>
#include <string>
#include <vector>

int main(int argc, char** argv) {
    std::cout << "add(1, 2) = " << add(1, 2) << std::endl;

    std::vector<std::string> stdvec = { "Hello", "vscode", "xmake", "C/C++", "!!!" };
    for (auto &&i : stdvec)
    {
        std::cout  << i << " ";
    }
    std::cout << std::endl;    
    
    std::cout << "Hello launch.json" << std::endl;    // 增加输出 Hello launch.json

    return 0;
}

保存后直接 按 F5 启动调试,发现并没有输出 Hello launch.json,原因是因为没有编译

在这里插入图片描述

在使用vs2013习惯了自动编译,通过在 launch.json 文件配置 preLaunchTask 执行前置的构建任务,内容修改如下

{
    // 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": [
        {
            "type": "xmake",                // 调试类型 xmake
            "request": "launch",            // 请求方式是运行
            "name": "xmake-d",              // 名称, 修改一个好识别的
            "target": "target name",        // 目标名
            "cwd": "${workspaceFolder}",    // 工作目录
            "stopAtEntry": false,            // 默认是true, 设为true时程序将暂停在程序入口处,相当于在main上打断点
            "preLaunchTask": "xmake-b"      // 运行前执行 xmake-b 任务
        }
    ]
}

再次按 F5 启动调试,发现并输出 Hello launch.json

配置调试程序的参数

修改 main.cpp, 增加 输出 argv 的值

#include "foo.h"
#include <iostream>
#include <string>
#include <vector>

int main(int argc, char** argv) {

    std::cout << "开始打印程序的参数!" << std::endl;
    for (int i = 0; i < argc; ++i)
    {
        std::cout << "参数" << i << " " << argv[i]  << std::endl;            
    }
    std::cout << "结束打印程序的参数!" << std::endl;


    std::cout << "add(1, 2) = " << add(1, 2) << std::endl;

    std::vector<std::string> stdvec = { "Hello", "vscode", "xmake", "C/C++", "!!!" };
    for (auto &&i : stdvec)
    {
        std::cout  << i << " ";
    }
    std::cout << std::endl;    
    
    std::cout << "Hello launch.json" << std::endl;    

    return 0;
}

修改 launch.json 文件, 增加设置 argv 值,

{
    // 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": [

        {
            "type": "xmake",                // 调试类型 xmake
            "request": "launch",            // 请求方式是运行
            "name": "xmake-d",              // 名称, 修改一个好识别的
            "target": "target name",        // 目标名
            "cwd": "${workspaceFolder}",    // 工作目录
            "args": [                       // 配置调试程序的运行参数
                "ABC",
                "BCD",
                "123",
                "Hello launch param"
            ],
            "stopAtEntry": false,            // 默认是true, 设为true时程序将暂停在程序入口处,相当于在main上打断点
            "preLaunchTask": "xmake-b"      // 运行前执行 xmake-b 任务
        }
    ]
}

按 F5 运行程序,程序打印输出了程序参数

在这里插入图片描述

附加进程调试

调试程序还有一种经常遇到的情况,就是程序已经运行了,无法用 启动调试 的方法进行调试,在vs2013中都是通过 附加进程 方式进行调试

Linux

修改 main.cpp, 新增加 std::cin >> waitAttach; 用于程序运行起来后等待输入字符,这是好通过 vscode进行附加进程操作, 内容如下

#include "foo.h"
#include <iostream>
#include <string>
#include <vector>

int main(int argc, char** argv) {

    std::cout << "开始打印程序的参数!" << std::endl;
    for (int i = 0; i < argc; ++i)
    {
        std::cout << "参数" << i << " " << argv[i]  << std::endl;            
    }
    std::cout << "结束打印程序的参数!" << std::endl;

    std::cout << "验证Attach功能" << std::endl;
    std::cout << "第一步, 在std::cin >> waitAttach;下一句打断点" << std::endl; 
    std::cout << "第二步, 启动eg_prjs程序" << std::endl; 
    std::cout << "第三步, 在调试界面 选择 cppvsdbg attech" << std::endl; 
    std::cout << "第四步, 点击绿色执行按钮" << std::endl;
    std::cout << "第五步, 附加 eg_prjs 进程. 然后在 eg_prjs 控制台界面中输入字符回车后, 会自动停止打断点处"<< std::endl;  
    std::cout << "等待输入:" << std::endl;
    std::string waitAttach;
    std::cin >> waitAttach;
    std::cout << "输入值是:" << waitAttach  << std::endl;  


    std::cout << "add(1, 2) = " << add(1, 2) << std::endl;

    std::vector<std::string> stdvec = { "Hello", "vscode", "xmake", "C/C++", "!!!" };
    for (auto &&i : stdvec)
    {
        std::cout  << i << " ";
    }
    std::cout << std::endl;    
    
    std::cout << "Hello launch.json" << std::endl;    

    return 0;
}

修改完一定要 重新编译 下

打开 launch.json 文件,点击 Add Configuration… 文件

在这里插入图片描述

在弹出的窗口界面中选择 C/C++: (gdb) Attach

注:本篇文档也适用 vscode + xmake + msvc开发环境的配置,需要选择 C/C++: (Windows) Attach

在这里插入图片描述

自动把 (gdb) Attach 配置增加到 launch.json 文件中

"program": "enter program name, for example ${workspaceFolder}/a.out",

修改为

"program": "${workspaceFolder}/build/linux/x86_64/debug/eg_prjs",

launch.json 文件内容如下

{
    // 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": [
        {
            "name": "(gdb) Attach",
            "type": "cppdbg",
            "request": "attach",
            "program": "${workspaceFolder}/build/linux/x86_64/debug/eg_prjs", // 修改为程序运行的路径
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                },
                {
                    "description": "Set Disassembly Flavor to Intel",
                    "text": "-gdb-set disassembly-flavor intel",
                    "ignoreFailures": true
                }
            ]
        },        

        {
            "type": "xmake",                // 调试类型 xmake
            "request": "launch",            // 请求方式是运行
            "name": "xmake-d",              // 名称, 修改一个好识别的
            "target": "target name",        // 目标名
            "cwd": "${workspaceFolder}",    // 工作目录
            "args": [                       // 配置调试程序的运行参数
                "ABC",
                "BCD",
                "123",
                "Hello launch param"
            ],
            "stopAtEntry": false,            // 默认是true, 设为true时程序将暂停在程序入口处,相当于在main上打断点
            "preLaunchTask": "xmake-b"      // 运行前执行 xmake-b 任务
        }
    ]
}

在命令终端中输入

xmake run

先运行起程序

在这里插入图片描述

程序运行到等待输入操作,接下来切换到调试界面,如下图所示,启动项中选择 (gdb) Attach,然后点击旁边的绿色按钮(标记3)启动附加进程

在这里插入图片描述

在弹出命令面板的搜索框张输入 eg_prjs,查找到运行的进程

在这里插入图片描述

双击 eg_prjs 进程,发现弹出错误提示窗(请忽略进程的id,因为是多次启动, 进程的id发生变化,这并不影响本文档操作流程步骤)

在这里插入图片描述

出现这个原因是应该是没有权限,也许在截图的过程中超时导致的。可以尝试开启 linux 系统上的 xmake的远程编译环境(该操作会创建token),然后按下快捷键 Ctrl + C 终止这个服务。如果还不起作用,在window上启动cmd命令窗口,也同样启动一下 xmake 的远程编译环境,在关闭。

暂时还不明白什么原因,待学习研究中。

在这里插入图片描述

这样操作后可以附加进程调试了,附上 linux 指令

  • 查看下运行的进程

    ps aux
    
  • kill进程

    kill 进程id
    

确保当前没有 eg_prjs 进行在运行。

这次多开一个终端窗口方便查看,通过终端 分割 按钮分割成两个终端窗口

在这里插入图片描述

分割后如下图所示,并在第2个终端窗口输入 xmake run 启动 程序,并进入等待输入操作

在这里插入图片描述

切换到调试模式再次选择 (gdb) Attach,然后点击旁边的绿色按钮(标记3)启动附加进程

在这里插入图片描述

选择要附加的进程 eg_prjs

在这里插入图片描述

启动附加进程后,终端界面被自动切换了,需要把刚才 xmake run 界面显示出来,在最右侧的终端列表中点击 xmake eg_prjs

在这里插入图片描述

在下图的标记1处,输入字符串后回车

在这里插入图片描述

可以看到,附加调试停止在断点处

在这里插入图片描述

按下 F5 键,终端输出窗口打印的消息是在 24 行之后执行的。(注: 虽然输入的是 Hello Test Attach 但打印输出的是 Hello 这是C++输入缓冲区问题,有关C/C++编程请自行学习)

Window

本文也适用window、 xmake、msvc。

添加附加进程任务选择 C/C++: (Windows) Attach

在这里插入图片描述

遇到的问题是有win11可以正常查询进程,有的报错 wmic 错误,是因为win11系统中没有 wmic 程序。而vscode 1.96.2 还在使用 wmic 这个命令获取系统进程列表,可以自行安装或等待微软官网后期升级改进。报错截图如下

在这里插入图片描述

报错解释

Visual Studio Code (VS Code) 在尝试通过Windows Management Instrumentation Command-line (WMIC) 工具进行附加调试时,未能在系统上找到WMIC。WMIC是一个命令行界面,用于访问Windows系统的WMI信息。VS Code需要WMIC来启动附加进程的调试会话。

微软官网资料: WMI 命令行 (WMIC) 实用程序 - Win32 apps | Microsoft Learn
可以参考《 真是奇哉怪也,Windows11居然不支持WMIC?(附离线安装方法及安装包) 》安装WMIC

数据结构Visualizers

说明

在远端主机(linux)上用户目录下没有找到 .vscode 文件夹,这是在远端主机没有安装过 vscode,一直都是通过vscode ssh插件远程访问,vscode在远端主机上仅安装了 .vscode-server

在这里插入图片描述

进入到扩展文件夹下查看到 ms-vscode.cpptools-1.22.11-linux-x64

cd .vscode-server/extensions/

在这里插入图片描述

在这里插入图片描述

查看 debugAdapters 文件下并没有 vsdbg 文件夹。从 git hub 下载 cpptools 的cpptools-linux-x64_1.22.11.vsix和cpptools-windows-x64_1.22.11.vsix后,通过压缩软件(vsix实际是zip格式)打开 debugAdapters 文件夹对比

在这里插入图片描述

可以看到,微软没有将C/C++插件Visualizer功能支持l到inux版本的插件上,期望以后添加。

对应linux上自定义数据结构的Visualizers需要在学习其他方法(本次先停一段落)。

window上Visualizer

下面以 window 平台基于 msvc 编译环境(vs2022)为例。

系统环境

操作系统 Windows 11

工作环境 vscode、vs2022、xmake、git

关闭远程

关闭linux的远程链接,如下图所示,先点击 SSH: 192.168.1.82,在弹出的命令面板中点击 Close Remote Connection

在这里插入图片描述

下载代码

与linux保持一致的文件夹(除根目录)结构,创建 D:/stu 文件夹并按照前面的记录将代码克隆到 D:/stu 文件夹下

在这里插入图片描述

通过 File - Open Folder…切换到 eg_prjs 文件夹

实现举例

打开 foo/inc/fool.h 文件,在文件后面添加如下代码,其中 FXXDateTime 自定义数据类,演示在调试时如何显示类信息

/**
 * brief 日期时间. 为了避免与常用的名称区分, 定义名称为 FXXDateTime
 * 成员变量就是 年/月/日 小时:分钟:秒
 */
class __export FXXDateTime
{
public:
    FXXDateTime(int year, int month, int day, int hour, int minute, int second);
    ~FXXDateTime();

/// 头文件除了提供API外, 更重要的是让使用者通过查看头文件就知道怎么使用(谁还看文档[文档该写还是的得写], 除非必要, 大家用微信有看过微信说明吗),
/// 那么使用者最关心的就是public部分, 根本就不看private部分, protected部分根据情况才看
/// 私有的放在前面, 在阅读的时候还要把代码拉到下面, 不觉的麻烦么. 
/// 我的理念是private部分放在类的最后面, 其次是protected部分, public放在类的最前面. 因为实际开发过程中我也从不看私有(除非必要).
/// 况且类似Qt库等做法, 把私有数据完全封装到一个data的结构体中, 类中只有一个data的指针, 继承类连data的指针都看不见.
/// 这里只是演示, 定义成员变量如下
/// @cond
private:
    int m_year;
    int m_month;
    int m_day;
    
    int m_hour;
    int m_minute;
    int m_second;
/// @endcond
};

打开 foo/inc/fool.cpp 文件,在文件后面添加如下代码

FXXDateTime::FXXDateTime(int year, int month, int day, int hour, int minute, int second)
    : m_year(year)
    , m_month(month)
    , m_day(day)
    , m_hour(hour)
    , m_minute(minute)
    , m_second(second)
{}

FXXDateTime::~FXXDateTime()
{
}

在 app/main.cpp 文件,添加在 main() 入口函数(为了好打断点)

#include "foo.h"
#include <iostream>
#include <string>
#include <vector>

int main(int argc, char** argv) {





    // 里 main 远点是为了腾出空间好查看 fdatetime 变量的调试信息
    FXXDateTime fdatetime(2024, 12, 22, 05, 53, 29); // 添加到这里, 在下面一句打断点, 调试运行后将鼠标悬停在fdatetime变量上

    std::cout << "开始打印程序的参数!" << std::endl;  // 打断点
    for (int i = 0; i < argc; ++i)
    {
        std::cout << "参数" << i << " " << argv[i]  << std::endl;            
    }
    std::cout << "结束打印程序的参数!" << std::endl;

    std::cout << "验证Attach功能" << std::endl;
    std::cout << "第一步, 在std::cin >> waitAttach;下一句打断点" << std::endl; 
    std::cout << "第二步, 启动eg_prjs程序" << std::endl; 
    std::cout << "第三步, 在调试界面 选择 cppvsdbg attech" << std::endl; 
    std::cout << "第四步, 点击绿色执行按钮" << std::endl;
    std::cout << "第五步, 附加 eg_prjs 进程. 然后在 eg_prjs 控制台界面中输入字符回车后, 会自动停止打断点处"<< std::endl;  
    std::cout << "等待输入:" << std::endl;
    std::string waitAttach;
    std::cin >> waitAttach;
    std::cout << "输入值是:" << waitAttach  << std::endl;  


    std::cout << "add(1, 2) = " << add(1, 2) << std::endl;

    std::vector<std::string> stdvec = { "Hello", "vscode", "xmake", "C/C++", "!!!" };
    for (auto &&i : stdvec)
    {
        std::cout  << i << " ";
    }
    std::cout << std::endl;    
    
    std::cout << "Hello launch.json" << std::endl;        


    return 0;
}

在这里插入图片描述

按下 F5 启动调试看看,需要注意的调试 快捷键 是否配置正确,检测是否和下图一致。也可手动编译、调试(没有直接按下 F5 编译和调试一起执行的方便,使用vs2022遗留的习惯)。请参考 配置运行调试 确保配置正确。

在这里插入图片描述

查看一下调试运行效果,记得鼠标悬停在 fdatatime 变量上才能看到标记2的信息

在这里插入图片描述

标记3的显示效果还是不能像 argc = 5 那样正常显示,接下来要做的就是如何让fdatetime像 argc = 5 那样显示

微软官方资料 创建 C++ 对象的自定义视图 - Visual Studio (Windows) | Microsoft Learn 使用 Natvis 框架在调试器中创建 C++ 对象的自定义视图。

[C++][调试技巧] VS 中的 Debugger Visualizers 使用指南 (.natvis文件)_vs debugger-优快云博客

本着开发程序管理一切的变更都要有版本控制和记录,那么首先在 eg_prjs 工程下创建一个文件夹,用于管理其他文件。

举例创建文件夹名为 natvis,如下图所示

在这里插入图片描述

在 natvis 文件夹下新建一个 eg_prjs.natvis 文件,内容如下

<?xml version="1.0" encoding="utf-8"?>
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">

 <Type Name="FXXDateTime">
    <DisplayString>{{ {m_year}/{m_month}/{m_day} {m_hour}:{m_minute}:{m_second} }}</DisplayString>
    <Expand>
      <Item Name="[year]">m_year</Item>
      <Item Name="[month]">m_month</Item>
      <Item Name="[day]">m_day</Item>
      <Item Name="[hour]">m_hour</Item>
      <Item Name="[minute]">m_minute</Item>
      <Item Name="[second]">m_second</Item>      
    </Expand>
  </Type>

</AutoVisualizer>

确保调试快捷键切换回 xmake-d

在这里插入图片描述

按下 快捷键 Ctrl + Shift + B,命令面板中选择设置过的 xmake-b 启动编译

在这里插入图片描述

可以看到,正确执行设置的 xmake c,xmake -v 命令。从编译信息看编译失败的原因是源文件的代码页问题,UTF-8 格式的文件需要 BOM 标签msvc才能较好的支持,linux 是不需要的,可能是为了兼容微软的规则,目前linux也支持编译带有 BOM 标签的文件,因此代码的文本格式建议都修改为带有 BOM 标签的 UTF-8。

下面切换一下文本的编码格式。打开源码文件, 点击右下角 UTF-8,弹出的界面选择 Save with Encoding

在这里插入图片描述

选择 UTF-8 with BOM utf8bom

在这里插入图片描述

再次快捷键 Ctrl + Shift + B,命令面板中选择设置过的 xmake-b 启动编译

在这里插入图片描述

编译成功,打开 main.cpp 文件,在第15行打断点,启动调试。

注: xmake插件和vscode 协调性需要注意一下,通过快捷键 F5 启动自定义编译、调试运行任务有时失效,需要在命令面板中 通过 >XMake:Build或>XMake:ReBuild 编译后在按 快捷键 F5 就会生效。

在这里插入图片描述

看到的效果还不是预期的,原因是还没有使用 eg_prjs.natvis 文件,把 eg_prjs.natvis 文件拷贝到

C:\Users\xxx\.vscode\extensions\ms-vscode.cpptools-1.22.11-win32-x64\debugAdapters\vsdbg\bin\Visualizers

文件夹下,xxx 是实际用户名, ms-vscode.cpptools-1.22.11-win32-x64 根据当前安装的版本决定

在这里插入图片描述

再次启动调试

在这里插入图片描述

可以看到,调试信息中关于 fdatetime 变量显示的信息是符合预期。

配置intellisense

创建工程

把eg_prjs中的foo模块作为一个外部库使用。在 stu_linux 文件夹下创建一个 eg_app 文件夹,如下图所示

在这里插入图片描述

在vscode中打开 eg_app 文件夹,并通过 >XMake:CreateProject - c++ - console 创建一个C++的控制台程序,目录结构如下图所示

在这里插入图片描述

引用foo模块

引用前面的 eg_prjs 工程下已经生成了 foo 模块并使用 foo 模块的 add 函数和 FXXDatetime 类。

修改 xmake.lua 配置文件

add_rules("mode.debug", "mode.release")

target("eg_app")
    add_includedirs("../eg_prjs/src/foo/inc")                          -- 增加头文件夹的路径
    if is_plat("linux") then                                           -- 是否是linux平台
        if is_mode("debug") then                                       -- 是否是调试模式
            add_linkdirs("../eg_prjs/build/linux/x86_64/debug")        -- 增加链接库的路径
            add_rpathdirs("/home/xx/stu/stu_linux/eg_prjs/build/linux/x86_64/debug")       -- 添加程序运行时动态库的加载搜索目录. 遇坑指南, 必须是绝对路径
        else 
            add_linkdirs("../eg_prjs/build/linux/x86_64/release")
            add_rpathdirs("/home/xx/stu/stu_linux/eg_prjs/build/linux/x86_64/release")       
        end
        add_links("libfoo.so")                                         -- 引用 foo 模块链接库
    end 
    set_kind("binary")
    add_files("src/*.cpp")

修改 main.cpp 文件

#include <foo.h>
#include <iostream>

int main(int argc, char** argv) {
    
    FXXDateTime fdatetime(2024, 12, 22, 05, 53, 29);  // 添加到这里, 在下面一句打断点, 调试运行后将鼠标悬停在fdatetime变量上
    std::cout << "add(1, 2) = " << add(1, 2) << std::endl;
    
    return 0;
}

点击构建

在这里插入图片描述

可以看到构建成功,但是标记3处, #include <foo.h> 未能正确解析(有红色波浪线提示),FXXDatetime 显示颜色提示也不正确

打开控制面板,选择 C/C++: Edit Configurations(JSON) ,也可以选择 C/C++: Edit Configurations(UI) 根据个人习惯来定

在这里插入图片描述

{
    "configurations": [
        {
            "name": "Linux",
            "includePath": [
                "${workspaceFolder}/**",
                "/home/xx/stu/stu_linux/eg_prjs/src/foo/inc/**"  // 增加 foo模块的头文件路径
            ],
            "defines": [],
            "compilerPath": "/usr/bin/clang",
            "cStandard": "c17",
            "cppStandard": "c++17",
            "intelliSenseMode": "linux-clang-x64"
        }
    ],
    "version": 4
}

在打开查看 main.cpp 文件,#include <foo.h> 、FXXDatetime 正确解析

在这里插入图片描述

运行程序,看到调用 foo 模块的 add 函数正常运行并输出结果3

在这里插入图片描述

Linux下C++开发 Linux属于多用户多任务操作系统,而Windows属于单用户多任务操作系统Linux一切皆文件目录结构bin存储二进制可执行文件dev存放的是外接设备,例如磁盘,光盘等。在其中的外接设备是不能直接被使用的,需要挂载etc主要存储一些配置文件home表示除了root用户以外,其它用户的家目录,类似于Windows下的User/用户目录proc全称process,表示进程,该目录存储的是Linux运行时候的进程root该目录是root用户自己的家目录sbin全称。 阅读详情

相关推荐

VSCode搭建C/C++开发环境:从编译器配置到调试全流程指南

集成开发环境(IDE)是现代软件开发的核心工具,它通过整合代码编辑、编译构建、调试测试等功能,极大提升了开发效率。其工作原理是提供统一的图形界面,调用底层编译器(如GCC、Clang)和调试器(如GDB),实现代码到可执行程序的转换与问题排查。对于C/C++这类系统级语言,一个配置得当的IDE能精准管理头文件路径、编译参数和调试符号,其技术价值在于将复杂的命令行操作可视化、自动化,降低学习曲线,保障项目构建的一致性。常见的应用场景包括桌面应用开发、嵌入式编程、算法学习和系统工具编写。本文聚焦于轻量且强大的编

weixin_34007906的博客 432

Linux环境使用VSCode调试简单C++代码

本文将通过演示一个简单C++代码的编译调试过程,介绍在VSCode中如何使用Linux环境下的g++编译器和gdb调试器。

hypc9709的博客 1万+

RedPanda-CPP:超轻量C/C++ IDE的安装配置与实战指南

集成开发环境(IDE)是提升编程效率的核心工具,它通过整合代码编辑、编译、调试等功能,为开发者提供一站式解决方案。其工作原理在于将底层工具链(如编译器、调试器)与用户界面无缝衔接,实现代码的高效构建与问题定位。在C/C++开发领域,一个优秀的IDE能显著降低环境配置复杂度,尤其对于教学、嵌入式验证等场景。RedPanda-CPP正是这样一款专注于轻量与开箱即用的IDE,它内置编译器管理和图形化调试支持,解决了传统配置繁琐的痛点。通过极简的安装流程和清晰的CMake项目管理,开发者可以快速搭建开发环境,专注于

weixin_33940469的博客 416

linux下C++开发

一、 开发环境搭建 操作系统:Ubuntu64位 1.安装GCC,GDB 执行一下指令安装编译器和调试器: sudo apt update // apt相当于手机中的应用市场 sudo apt install build-essetial gdb 安装成功确认: gcc --version g++ --version gdb --version //如果成功,则显示版本号 2.安装CMake 指令: sudo apt install cmake 安装成功确认: cmak

qq_44771537的博客 1万+

VSCode远程开发实战:从零搭建C/C++高效调试环境

本文详细介绍了如何使用VSCode搭建高效的C/C++远程开发环境,涵盖环境配置、SSH无密码登录、项目初始化与调试技巧。通过实战案例展示如何利用VSCode的远程开发功能提升编译和调试效率,特别适合资源密集型项目和跨平台开发场景。

weixin_33724046的博客 552

Linux下VsCode配置C/C++开发环境:从工具链到调试全攻略

在软件开发中,编辑器与编译器各司其职,理解这一原理是配置高效编程环境的基础。Linux系统以其稳定性和可定制性成为C/C++开发者的首选平台,而VsCode作为轻量级编辑器,需借助底层工具链完成编译、调试与头文件搜索。通过合理配置gcc/gdb/make及核心配置文件tasks.json、launch.json和c_cpp_properties.json,可以实现一键构建、断点调试与智能提示。无论是个人学习还是工程实践,这套环境能显著提升开发效率,解决常见的编码乱码、头文件缺失、结构体成员补全错误等问题。本

weixin_31822733的博客 163

Linux下使用VSCode和CMake搭载C/C++开发环境

Linux下使用VSCode和CMake搭载C/C++开发环境 一. 开发环境介绍 1. 最终目的 2. 所使用的工具介绍 二. 开发工具安装 1. Visual Studio Code 2. 安装编译器和调试器 3. 安装CMake 三. 开发环境配置 1. 创建测试目录并用VSCode打开 2. 编写cpp和CMake文件 3. 编写json脚本实现一键自动化编译调试 四. 编译和调试工程 五. 总结...

LPS 6089

VS Code代码补全失效?5分钟搞定C++项目配置(附常见坑点排查)

本文针对VS Code中C++代码补全失效问题,提供了一套5分钟快速解决方案,涵盖项目结构优化、核心配置文件详解、扩展插件组合及高级调试技巧。重点解析了c_cpp_properties.json等关键配置,并附常见坑点排查表,帮助开发者高效恢复智能提示功能。

tgb34567890的博客 926

VSCode搭建C/C++开发环境:从零配置到工程化实战指南

集成开发环境(IDE)是程序员的核心生产力工具,它通过整合代码编辑、编译、调试等功能,极大提升了开发效率。在众多IDE中,Visual Studio Code(VSCode)凭借其轻量、跨平台和强大的插件生态脱颖而出,成为现代开发的热门选择。通过配置编译器工具链(如GCC/MinGW-w64)和调试器(GDB),并利用C/C++等核心插件,VSCode可以变身为功能齐全的C/C++ IDE。其技术价值在于提供了高度可定制、免费且性能优异的开发体验,尤其适合从嵌入式到大型项目的各类C/C++开发场景。本文聚焦

weixin_33940469的博客 305

C/C++开发环境配置:从VSCode到CMake的工程化实践指南

在软件开发中,构建系统是连接源代码与可执行产物的关键桥梁,它管理着编译、链接等复杂过程。其核心原理在于通过定义明确的规则和依赖关系,将高级语言转化为机器指令。对于C/C++这类接近底层的语言,构建系统的价值尤为突出,它直接决定了项目的可移植性、可维护性和团队协作效率。在实际应用场景中,开发者常面临跨平台编译、依赖管理、环境一致性等挑战。本文聚焦于**VSCode**与**CMake**的深度集成,通过解析编译器、构建工具与IDE的三者关系,提供一套从单文件调试到复杂项目管理的可迁移、可复现的工程化解决方案,

weixin_34253126的博客 413

Arch Linux 下 VS Code 配置 C/C++ 编译与 GDB 调试环境实战

在 Linux 开发环境中,C/C++ 编译调试涉及工具链安装、头文件路径识别与调试器配置等基础环节。其原理在于通过编译器驱动代码生成,并借助调试器实现断点跟踪与变量查看。合理配置可显著提升开发效率,避免因路径或版本问题导致的调试失败。典型场景包括单文件与多文件项目构建、条件断点及 core dump 分析。在 Arch 这类滚动更新发行版上,VS Code 结合 GCC/Clang 与 GDB 的配置尤为关键,需关注头文件搜索路径与调试信息生成,以确保 IntelliSense 准确和断点有效。

weixin_31321361的博客 237

programming-cpp 项目常见问题解决方案

programming-cpp 项目常见问题解决方案 项目基础介绍和主要编程语言 programming-cpp 是一个专注于 C++ 技术栈的开源项目,旨在为学习 Linux C/C++ 编程的开发者提供学习笔记、视频教程、电子书以及相关项目资源。该项目涵盖了从基础的 C 语言到高级的 C++ 编程、STL、Boost 库、网络编程、设计模式等多个方面的内容。通过这个项目,开发者可以系统地学习 ...

gitblog_01140的博客 590

详解Linux下使用vscode编译运行和调试C/C++

本教程将具体详解使用Visual Studio Code在Linux环境下使用C/C++方法。 GCC C++ 编译器 (g++) 和 GDB 调试器的方法。 GCC是GNU 编译器集合; GDB 是 GNU 调试器。 1.先决条件 安装Visual Studio Code. 安装C++拓展插件。点击在vscode界面最左侧的Extensions图标(打开快捷键:ctrl+shift+X),搜索“C/C++”,点击进行安装。 确保已安装gcc. 一般ubuntu系统会预装gcc.在终端窗口中输入如下命令

休的博客 6242

VSCode配置C/C++开发环境全指南:从编译器到调试器一步到位

在程序开发中,搭建一套可用的本地编译调试环境是很多新手遇到的第一个门槛。很多人以为装好代码编辑器就能直接运行C/C++程序,但实际上面向过程的语言开发需要编辑器、编译器、调试器协同工作。编辑器负责代码编辑与智能提示,编译器负责将源码转为可执行文件,调试器则帮助定位运行时错误。理解这些基础组件的作用后,再通过tasks.json、launch.json等配置文件将工具链串联起来,就能实现一键编译与断点调试。无论是Windows下的MinGW-w64环境,还是Linux自带的gcc/gdb,掌握这一套配置思路都

weixin_30129025的博客 146

VSCode配置C/C++开发环境:从MinGW安装到tasks.json/launch.json调试实战

C/C++程序的运行离不开编译器、调试器等底层工具链,而编辑器只是前端界面。理解gcc/gdb等工具的作用,是配置开发环境的关键。MinGW-w64作为Windows上的原生GNU工具链,提供了编译调试所需的完整组件。掌握VSCode中tasks.json、launch.json等配置文件,能将编译、运行、调试一键串联,提升开发效率。无论是课程作业还是小型项目,合理的环境配置都能避免“编译通过但调试失败”等隐患。本文从工具链安装到多文件工程配置,系统梳理VSCode下C/C++的完整开发流程。

weixin_28595749的博客 287

axi ps读写pl_PL读写DDR:Datamover能干什么

最近发现工程项目中一直在用AXI-DMA。这玩意儿搬数据倒是没问题,就是用axi-lite配置起来非常反人类。。。简单的办法其实是用datamover ip核。这个ip核能干嘛呢。准备写个文章解析一下。由于好多feature没用过,所以仅仅看文档可能理解有误,欢迎指出错误。首先扫个盲:MM2S指的是Memory map to stream. 读DDR. S2MM指的是steam to memory...

weixin_35908791的博客 1598

vs code linux下环境配置

c_cpp_properties.json: { "configurations": [ { "name": "linux-gcc-x64", "includePath": [ "${workspaceFolder}/**" ], "compilerPath": "/usr/bin/gcc", "cStandard": "${default}", "cppStandard": "${default}".

m0_52796585的博客 2131

从理论到板级:FOC电机驱动硬件电路全链路设计解析

本文从硬件工程师视角,深度解析FOC电机驱动从理论到板级实现的全链路设计。重点剖析了电源保护、核心采样电路、三相逆变桥与驱动电路等关键硬件模块的设计要点与实战经验,强调硬件是FOC算法可靠运行的基石,并提供了PCB布局布线的核心原则,帮助开发者构建高性能、高可靠性的电机驱动硬件平台。

weixin_29240711的博客 333

VSCode配置Qt开发环境:解决C/C++扩展路径问题

在跨平台C++开发中,Qt框架因其丰富的模块和跨平台特性被广泛使用。开发环境配置是工程实践中的重要环节,特别是IDE对框架头文件的正确识别直接影响代码补全、跳转定义等核心功能。通过配置VSCode的C/C++扩展includePath参数,可以解决Qt头文件找不到的问题。这一技术方案不仅适用于Qt开发,也是理解现代IDE如何实现代码智能提示的典型案例。具体到Qt项目,需要正确配置qmake路径、模块宏定义等参数,同时考虑多版本管理和跨平台兼容性。对于大型项目,合理设置includePath范围和使用comp

weixin_42523670的博客 299

使用 Cynthion 与 Packetry 进行 USB 抓包与协议分析

Cynthion 是 Great Scott Gadgets 推出的USB 流量分析与注入设备。它具备以下特点:通过 FPGA 实现高速 USB 流量捕获;能够同时作为 USB Host 和 Device,进行调试和测试;支持输出 pcap 文件,可直接用 Wireshark 分析;提供 Python API,方便与上层软件联动。简单来说,Cynthion 是一个USB 协议分析仪 + 注入工具。硬件层捕获:实时拦截 USB 总线上的数据包;软件层解析。

YIMUleizi的博客 1264

论文翻译:Automatic Lesson Plan Generation via Large Language Models with Self-critique Prompting

在本文中,我们利用大型语言模型(LLMs)的理解和生成能力来自动生成定制化的课程计划。这解决了传统计划可能无法充分满足不同教学环境和学生群体的特定需求的常见挑战。我们提出了一个新颖的三阶段过程,包括使用检索增强生成(RAG)逐步生成课程计划的每个关键组成部分,通过LLMs进行自我批评,以及随后的细化。我们使用这种方法为小学2至5年级生成了涵盖80多个主题的数学课程计划。邀请了三位经验丰富的教育工作者制定全面的课程计划评估标准,然后使用这些标准将我们的LLM生成的课程计划与同一主题的实际课程计划进行基准比较。

CSPhD-winston的博客 1102

Linux下VsCode配置C/C++开发环境:从编译器到调试器一站式搞定

在Linux上进行C/C++开发,编辑器、编译器、调试器各司其职:VsCode仅提供交互界面,真正完成编译与调试的是gcc/g++和gdb。理解这一原理后,通过tasks.json和launch.json串联编译任务与调试启动,即可实现F5一键运行。配置c_cpp_properties.json中的includePath和compilerPath,可解决智能提示失灵、头文件找不到等问题;当项目规模扩大,基于CMake生成的compile_commands.json能让智能提示与编译结果完全一致。本文从工具链

weixin_28839629的博客 236

制作你自己的yolov5数据集并进行训练

项目地址:make-your-yolov5_dataset 一、数据集标注软件 labelImg labelMe 精灵标注助手 更多的标注工具你可以去看:深度学习图像标注工具汇总 、 十个最常用深度学习图像/视频数据标注工具 、 百度一下 在这里我选择使用labelImg 二、数据集标注 下载labelImg 解压,直接打开labelimg.exe labelImg标注数据 标注完成后即可获得VOC格式(生成.xml文件)的数据 目录结构: dataset │ ├─Annotations .

年少的勇气已经用完,剩下的就是三思而后行 1万+
上一篇: Linux C/C++ 配置编程环境
下一篇: 安装Tiny Core Linux 和 部署nginx
明台
博客等级 码龄19年 86粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值