Ubuntu中用VSCode交叉编译程序放到从机上运行

news2024/11/18 5:29:28

文章目录

  • 前言:
  • 1. 前期准备:
    • 1.1 树莓派系统烧录与虚拟机创建
    • 1.2 VSCode拓展下载
  • 2. 树莓派交叉编译链查询与下载
    • 2.1 交叉编译链如何判断下哪一个
    • 2.2 交叉编译链各种版本含义
  • 3. 开始操作
    • 3.1 创建helloworld程序
    • 3.2 配置交差编译链
      • 3.3 json文件说明与配置
      • 3.3.1 task.json
      • 3.3.2 launch.json
    • 3.3 编译与调试

前言:

这篇博客是以树莓派CM4为例子进行阐述,其他的arm架构等开发板也可以采用这样的方式进行交叉编译

近期在交叉编译上踩坑颇多,这里针对近期做好的效果进行记录。
本文是的配置环境是:
树莓派CM4核心板+CM4拓展板
VMware下的Ubuntu18.04.6虚拟机
VSCode linux版本


1. 前期准备:

1.1 树莓派系统烧录与虚拟机创建

树莓派烧录系统参考我写的烧录博客
Ubuntu系统如何烧录到vmware参考我写的另一篇博客
VSCode在linux的下载教程参考:linux下载vscode

1.2 VSCode拓展下载

交叉编译前我们还需要下载一些拓展。
在这里插入图片描述
拓展插件大致如下:

(1)、C/C++,C 和 C++的编译环境(必须)
(2)、C/C++ Snippets,即 C/C++重用代码块。(必须)
(3)、C/C++ Advanced Lint,即 C/C++静态检测 。(必须)
(4)、Code Runner,即代码运行。(必须)
(5)、Include AutoComplete,即自动头文件包含。(高效)
(6)、Rainbow Brackets,彩虹花括号,有助于阅读代码。
(7)、One Dark Pro,VSCode 的主题。(非必须)
(8)、GBKtoUTF8,将 GBK 转换为 UTF8。
(9)、ARM,即支持 ARM 汇编语法高亮显示(非必须,但方便)
(10)、Chinese(Simplified),即中文环境。(看个人水平)
(11)、vscode-icons,VSCode 图标插件,主要是资源管理器下各个文件夹的图标。(美观)
(12)、compareit,比较插件,可以用于比较两个文件的差异。
(13)、DeviceTree,设备树语法插件。(非必须)
(14)、TabNine, AI 自动补全插件(高效)

2. 树莓派交叉编译链查询与下载

2.1 交叉编译链如何判断下哪一个

树莓派的交叉编译链工具根据个人所下载的树莓派系统有关,我这里下载的是树莓派lite64位版本。
如果忘了自己的树莓派系统是什么版本,可以在树莓派控制端输入指令:uname -a显示树莓派的系统的一些信息。
比如我的是:
Linux raspberrypi 5.15.84-v8+ #1613SMP PREEMPT Thu Jan 512.03.08 GMT 2023 aarch64 GNU/Linux
这里解释一下个字段含义,顺便给自己做个备忘。
系统名称:Linux
用户名:raspberrypi
操作系统的发行版号:5.15.84-v8+
内核版本:#1613SMP PREEMPT Thu Jan 512.03.08 GMT 2023
机器硬件(CPU名称):aarch64
操作系统名:GNU/Linux

通过上面的信息,我们可以知道我们队树莓派进行交叉编译的交叉编译工具链应该是aarch64-linux-gnu系列的,因此我们官网下载工具链->下载链接
在这里插入图片描述
在windows下载后,可以通过共享文件夹/U盘/SSH把交叉编译工具链放到linux的目录中,这里的目录后面会用到。我下面用到的目录是我自己放置交叉编译链的地方,大家可以自行设定。

2.2 交叉编译链各种版本含义

有的读者可能和我之前一样,不知道各种交叉编译链对应的意思,这里可以参考我转载的记录文章:
交叉编译详解


3. 开始操作

这个小节开始,开始详细记录整个交叉编译的流程。

3.1 创建helloworld程序

首先在虚拟机的主文件夹下创建Hello文件夹

在这里插入图片描述

打开VSCode选择打开文件夹,选择刚才的路径

在这里插入图片描述

在这里插入图片描述
创建hello.c文件
在这里插入图片描述这里可能会出现无法输入的情况,因为左下角这里不是insert模式,需要我们按一下a
在这里插入图片描述

输入测试代码:

#include<stdio.h>
int main()
{
    printf("helloWorld");
    return 0;
}

3.2 配置交差编译链

在这里插入图片描述
这里的环境和配置都先选第一个,接着会改。

在这里插入图片描述
在这里插入图片描述
选择后,点击1所在位置,接着看2,针对我们的2框,下面做详细解释。
在这里插入图片描述

3.3 json文件说明与配置

VSCode最劝退人的一步大概率就是这个json文件的配置了,关于json文件的说明如下:
task.json是gcc编译产生可执行文件的配置文件。
launch.json是gdb调试使用的配置文件。
我们分别对两个自动生成的json文件进行阐述。

3.3.1 task.json

这里我们着重关注以下三个标识:
label:任务名称
command:对应使用gcc的具体路径
args:gcc对应的参数


我们手动编译的时候,其实类似于gcc -g hello.c -o hello这样的指令
那么在task.json中,实现这样的指令用到的就是command args

下面的代码中,command指定了树莓派交叉编译工具链中gcc的位置,args则表明了执行的可选项。
其中${fileDirname}和下面参数cwd(current work directory)对应,表示当前工作目录。
那么-o后面紧跟着的参数其实就是生成的可执行文件输出的位置。

其实也可以输出到特定文件夹,通过相对路径和绝对路径进行书写。

这里面detail标识其实就类似于一个注释,我这里写了gcc路径,其实可以根据自己需求自定义。

{
    "tasks": [
        {
            "type": "cppbuild",
            "label": "RaspiGCC",
            "command": "/home/fpga/Raspi/RaspiToolChain/bin/aarch64-linux-gnu-gcc",
            "args": [
                "-g",
                "hello.c",
                "-o",
                "${fileDirname}/Test"
            ],
            "options": {
                "cwd": "${fileDirname}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "detail": "gccPath:/home/fpga/Raspi/RaspiToolChain/bin/aarch64-linux-gnu-gcc"
        }
    ],
    "version": "2.0.0"
}

当然,具体运用的时候可能不止编译一个.c文件,对于多个文件我们这样写。生成的可执行文件保存到当前路径下的out目录中,
这里${fileBasenameNoExtension}见文知意,生成的文件名为.c文件没有后缀的执行性文件。

"args": [
			"-g",
			"${fileDirname}/*.c",
			"-o",
			"${fileDirname}/out/${fileBasenameNoExtension}"
			],

上面是针对很多.c文件的方式,如果就那么几个,我们还可以单独列出来写。
现在假设hello.c和world.c在同一个文件夹,这里两种写法其实一个意思。如果我们在选择源文件的时候不给路径,默认是从当前路径下进行操作。
如果不同文件夹下的不同源文件进行编译,那其实只需要说明路径即可。
例如:用/home/user/world/world.c代替world.c

"args": [
			"-g",
			"${fileDirname}/hello.c",
			"world.c"
			"-o",
			"${fileDirname}/out/${fileBasenameNoExtension}"
			],

3.3.2 launch.json

launch.json是debug用的,我们其实可以通过看type标签知道。

在debug之前要有可执行文件才能debug,所以就需要前置条件。
我们看到preLaunchTask,这里说明的是在执行launch.json配置文件之前所要执行的任务。
这里和task.json中的Label标签的值对应,我这里都设置为RaspiGCC,是我自己为了方便知道这个json是给什么用的。如果图省事其实可以选择默认的C/C++: gcc 生成活动文件,只要保持两个文件的字段保持一致就可以了。

gcc指定了对应的交叉编译链工具位置,gdb也需要指定。
miDebuggerPath中的字段即为自己安装交差编译链中gdb所在的地方。

那调试程序还需要知道调试的是什么程序,我们可以通过program字段来确定。
字段的值要对应刚才生产的可执行文件的名称。
因为刚才的task.json选择生成的可执行文件是在当前目录下,名为Test的可执行文件,所以我们在设置program字段的时候,也要进行对应。

{
"version": "0.2.0",
    "configurations": [

        {
            "name": "(gdb)start",
            "type": "cppdbg",
            "request": "launch",
            "program": "${fileDirname}/Test",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${fileDirname}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "为 gdb 启用整齐打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "RaspiGCC",
            "miDebuggerPath": "/home/fpga/Raspi/RaspiToolChain/bin/aarch64-linux-gnu-gdb"
        }
    ]
}

3.3 编译与调试

编译的时候我们得切换到.c文件才可以选择编译和调试
在这里插入图片描述

在这里插入图片描述编译成功后,会生成可执行文件,可执行文件的位置是自己定的。但是我自己演示的始发现无法调试。
出现下面情况

后来才意识到我是基于树莓派的交差编译链,这和Ubuntu中的环境不一样。所以调试的话得远程调试,虚拟机的VSCode并不支持调试这个交差编译链生成的可执行文件。
至于VSCode远程调试树莓派的话,参考VScode远程linux,这篇博客里面也有各个字段的详细解释。

把可执行文件放到树莓派运行,结果可行,表明博客所写均验证。
在这里插入图片描述


总结:这篇博客写的时间比较长,也是近期踩坑以及探索过程的一个总结。
详细记录了自己交叉编译过程,为后面嵌入式等交叉编译都打了个基础。
对VSCode的json文件有了更深的理解,感觉自己功力又大进了一步哈哈哈哈。


澄澈i
用简单的语言记录自己走过的技术路

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/441997.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

变压器感量计算

1、L:感量计算LBmax*Ae*Np*R/V0.3*17.1*123*1.8/1.01.15mH 第一步:根据经验确定一个大概的感量值。 第二步:实际Sense电压波形测试&#xff0c;判断有没磁饱和&#xff0c;频率是否正确。 W功率 L感量 变压器 …

学系统集成项目管理工程师(中项)系列08a_合同管理(上)

1. 合同&#xff08;Contract&#xff09; 1.1. 契约 1.2. 广义概念 1.2.1. 以确定各种权利与义务为内容的协议&#xff0c;即只要是当事人之间达成的确定权利义务的协议均为合同&#xff0c;不管它涉及哪个法律部门及何种法律关系 1.2.2. 合同除应包括民法中的合同外&…

HTTP请求UML时序图--(POST)图和(GET)图源码分析及代码分析和MIME 介绍--常用的状态码说明

目录 WEB 开发通信协议-HTTP 什么是 HTTP 协议 介绍 http 请求 hi.html 的 UML时序图 HTTP 请求包分析 1. HTTP 请求包分析(GET)图, 说明 可以通过浏览器抓包分析 代码说明 HTML部分 JAVA部分 web.xml部分 3) 完成测试&#xff0c;并抓包分析 HTTP 请求包分析(POST…

汽车车身钣金—车身连接方式

摘要&#xff1a; 当汽车车身构件遭受严重损伤失去维修意义时,汽车维修厂商一般采用更换部件或总成的方法进行修复。 车身连接方式 当汽车车身构件遭受严重损伤失去维修意义时,汽车维修厂商一般采用更换部件或总成的方法进行修复。 车身外部覆盖件大多由相对独立的板件相互…

场效应管(MOS)基础知识

MOSFET管是常用的半导体器件&#xff0c;又称为开关管、场效应管、英文名称&#xff08;MOSFET),简称MOS管 按元件封装工艺可分为两大类:插件类、贴片类。大部分MOSFET管的外观极其类似&#xff0c;常见的封装种类有T0-252&#xff0c;T0-251&#xff0c;T0-220&#xff0c;T0—…

清华发布工具学习框架,让ChatGPT操控地图、股票查询,贾维斯已来?

文&#xff5c;小戏 首先来考大家一道初中历史题&#xff1a;人区别于动物的根本标志是什么›&#xff1f;书上的标准答案是人会制造与使用工具。那么再来一道思考题&#xff0c;如果 AI 会使用甚至会制造工具了以后&#xff0c;会发生什么呢&#xff1f;是像贾维斯一样的 AI 私…

【Java基础】day16

day16 一、switch-case 和 if-else 谁更快&#xff1f; switch-case 在 switch-case 中&#xff0c;case 的值是连续的话&#xff0c;会生成一个 TableSwitch 来进行优化&#xff0c;这样的情况下&#xff0c;只需要在表中进行判断即可。 这里使用 0-4 的连续值来进行测试 如…

UE4: Niagara系统实现雨天效果,并跟随人物移动

目录 创建雨丝Niagara系统雨丝跟随人物移动 创建雨丝Niagara系统 1.创建一个Niagara系统 选择Fountain选项&#xff0c;点一下加号&#xff0c;再点完成&#xff1a; 命名一下打开&#xff1a; 先从粒子生成的方向入手&#xff0c;在Niagara的界面中删掉“Add Velocity in…

springboot+vue小区物业管理系统(源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的小区物业管理系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 &#x1f495;&#x1f495;作者&#xff1a;风…

C11新特性之Lambda表达式

一.lambda语法 优点&#xff1a; 1.可以定义简短的函数。 2.使用lambda表达式使代码更紧凑&#xff0c;可读性更好。 语法&#xff1a; []表示不捕获任何变量[this]表示值传递方式捕捉当前的this指针 [&]表示引用传递方式捕捉所有父作用域的变量&#xff08;包括this&…

[架构之路-170]-《软考-系统分析师》-5-数据库系统-1-数据库模式、数据模型、数据库访问的标准接口

在当今的知识经济时代&#xff0c;信息是经济发展的战略资源&#xff0c;信息技术已经成为社会生产力中重要的组成部分。人们充分认识到&#xff0c;数据库是信息化社会中信息资源管理与开发利用的基础&#xff0c;当今的计算机信息系统也都以数据库技术为基础。对于一个国家来…

Linux DNS服务

DNS 作用 DNS是 域名系统 的英文缩写&#xff0c;作为将域名与IP地址相互映射的一个分布式数据库&#xff0c;让人可以通过域名访问互联网 正向解析 将域名解析为IP反向解析 根据IP查找对应域名 域名结构 http://www.sina.com.cn./ http://主机名.子域.二级域.顶级域.根域 / 每…

【Linux学习】信号——预备知识 | 信号产生 | 核心转储

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《Linux学习》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 信号 &#x1f514;信号&#x1f3b5;预备知识&#x1f3b5;信号处理方法的注册 &#x1f514;信…

C/C++每日一练(20230421)

目录 1. 位1的个数 &#x1f31f; 2. 递归和非递归求和 ※ 3. 俄罗斯套娃信封问题 &#x1f31f;&#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 位1的…

大数据技术之Kafka——Kafka入门

目录 一、概述 1.1 为什么要有Kafka ​编辑 1.2 定义 1.3 消息队列 1&#xff09;消息队列的应用场景 2&#xff09;消息队列的两种模式 1.4 基础架构 二、Producer生产者 2.1 生产者消息发送流程 2.1.1 发送原理 2.2 异步发送API 2.2.1 普通异步发送 2.2.2 带回调…

第八章_Redis复制(replica)

是什么 官网地址 一句话 就是主从复制&#xff0c;master以写为主&#xff0c;Slave以读为主 当master数据变化的时候&#xff0c;自动将新的数据异步同步到其它slave数据库 能做什么 读写分离容灾恢复数据备份水平扩容支撑高并发 怎么使用 配从(库)不配主(库) 权限细节&am…

YOLOv8 更换主干网络之 MobileNeXt

《重新思考瓶颈结构以实现高效移动网络设计》 倒置残差块成为了移动网络架构设计的主流。它通过引入学习倒置残差和使用线性瓶颈的两个设计规则,改变了经典的残差瓶颈。在本文中,我们重新思考了这种设计改变的必要性,并发现它可能会带来信息丢失和梯度混淆的风险。因此,我们…

助力工业物联网,工业大数据之ODS层构建:代码结构及修改【九】

文章目录 01&#xff1a;ODS层构建&#xff1a;代码结构及修改02&#xff1a;ODS层构建&#xff1a;连接代码及测试03&#xff1a;ODS层构建&#xff1a;建库代码及测试04&#xff1a;ODS层构建&#xff1a;建表代码及测试 01&#xff1a;ODS层构建&#xff1a;代码结构及修改 …

漏扫常见(可验证)漏洞复现方法

SSL/TLS协议信息泄露漏洞(CVE-2016-2183) 检测到目标服务支持SSL弱加密算法 检测到目标服务支持SSL中等强度加密算法 nmap -sV -p 端口 --script ssl-enum-ciphers 目标ipSSH支持弱加密算法 nmap -sV -p 端口 --script ssh2-enum-algos 目标ipApache Tomcat示例脚本信息泄露…

YOLOv8 更换主干网络之 ShuffleNetv2

《ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design》 目前,神经网络架构设计多以计算复杂度的间接度量——FLOPs为指导。然而,直接的度量,如速度,也取决于其他因素,如内存访问成本和平台特性。因此,这项工作建议评估目标平台上的直接度量,而…