Linux 基础入门操作-实验一 GCC使用

Linux 基础入门

前言

1 串口登录

本次登录可以采用串口登录,用usb线接入到系统,利用串口平台进行登录;

2 网口登录

2.1 路由器转接

电脑和开发板都接入路由器,路由器自动分开ip地址; 利用ipscan这个软件,可以扫描地址;

2.2 电脑和开发板直连

sudo ip addr add 192.168.1.10/24 dev eth0

其中 192.168.1.10是新的IP地址,/24是子网掩码,eth0是网络接口的名称。

启用接口

sudo ip link set dev eth0 up

禁用接口

sudo ip link set dev eth0 down

以下是基础实验

实验一 GCC使用

实验二 Makefile使用

实验三 “Hello World !”

实验四. 使用GDB调试器调试程序

实验五. 读写文件 25

实验六. Linux下的时间函数 30

实验七. 进程实验 38

实验九. 信号处理 45

实验八. 进程间通信 58

实验十 多线程应用程序设计 79

实验十一 串行端口程序设计实验 89

实验十二. 贪吃蛇小游戏 99

实验十三. TINY Web服务器 110

实验十四. 嵌入式数据库应用实验 128

实验十五 点亮LED

实验 按键

实验 显示屏

实验一 GCC 使用

1. 编译原理介绍

1.1 源代码与机器码

源代码就是程序员写出来的一个个代码文件,包括头文件和源文件。机器码是 CPU 可以直接解读的数据,由 0、1 组成,跟平台相关,ARM 平台跟 x86 平台的机器码是不一样的。
程序语言是为了方便程序员的开发而产生的,用机器码开发程序是不可能的,于是出现了汇编、c、c++、c#、java 等程序语言,它们都需要经过编译器的编译生成可执行程序(由机器码组成)。
不同平台使用的编译器不同,以 linux 开发为例,编译生成 x86 平台可执行程序使用 gcc 编译器,编译生成 arm 平台可执行程序需要使用 arm-linux-gcc。

交叉编译就是在 x86 平台上编译生成运行在 arm 平台上的可执行程序。

1.2 程序编译流程

源文件要经过预处理 (preprocessing)、编译 (compilation)、汇编 (assembly) 和连接 (linking) 等 4 步才能变成可执行文件。下面以嵌入式 linux 开发为例,讲解源文件编译流程。

1)预处理
C/C++源文件中,以“#”开头的命令被称为预处理命令,如包含命令“#include”、宏定义命令“#define”、条件编译命令“#if”、“#ifdef”等。预处理就是将要包含(include)的文件插入原文件中、将宏定义展开、根据条件编译命令选择要使用的代码,最后将这些东西输出到一个“.i”文件中等待进一步处理。预处理将用到arm-linux-cpp 工具。
2)编译
编译就是把 C/C++代码(比如上述的“.i”文件)“翻译”成汇编代码,所用到的工具为 cc1(它的名字就是 cc1,不是 arm-linux-cc1)。
3)汇编
汇编就是将第二步输出的汇编代码翻译成符合一定格式的机器代码,在 Linux 系统上一般表现为 ELF目标文件(OBJ 文件),用到的工具为 arm-linux-as。“反汇编”是指将机器代码转换为汇编代码,这在调试程序时常常用到。
4)连接
连接就是将上步生成的 OBJ 文件和系统库的 OBJ 文件、库文件连接起来,最终生成了可以在特定平台运行的可执行文件,用到的工具为 arm-linux-ld。

1.3 gcc 常用选项

1.总体选项(Overall Option)
1)-c

预处理、编译和汇编源文件,但是不作连接,编译器根据源文件生成 OBJ 文件。缺省情况下,GCC通过用.o'替换源文件名的后缀.c’,.i',.s’等,产生 OBJ 文件名。可以使用-o 选项选择其他名字。GCC 忽略-c 选项后面任何无法识别的输入文件。
2)-S
编译后即停止,不进行汇编。对于每个输入的非汇编语言文件,输出结果是汇编语言文件。缺省情况下,GCC 通过用.s'替换源文件名后缀.c’,`.i’等等,产生汇编文件名。可以使用-o 选项选择其他名字。GCC忽略任何不需要汇编的输入文件。

3)-E
预处理后即停止,不进行编译。预处理后的代码送往标准输出。GCC 忽略任何不需要预处理的输入文件。
4)-o file
指定输出文件为 file。无论是预处理、编译、汇编还是连接,这个选项都可以使用。如果没有使用-o'选项,默认的输出结果是:可执行文件为a.out’;修改输入文件的名称是source.suffix',则它的 OBJ 文件是source.o’,汇编文件是`source.s’,而预处理后的 C 源代码送往标准输出。

  1. 连接器选项(Linker Option)
    下面的选项用于连接 OBJ 文件,输出可执行文件或库文件。
    1)object-file-name
    如果某些文件没有特别明确的后缀(a special recognized suffix),GCC 就认为他们是 OBJ 文件或库文件(根据文件内容,连接器能够区分 OBJ 文件和库文件)。如果 GCC 执行连接操作,这些 OBJ 文件将成为连接器的输入文件。
    比如上面的“gcc -o test main.o sub.o”中,main.o、sub.o 就是输入的文件。
    2)-llibrary
    连接名为 library 的库文件。
    连接器在标准搜索目录中寻找这个库文件,库文件的真正名字是liblibrary.a'。搜索目录除了一些系统标准目录外,还包括用户以-L’选项指定的路径。一般说来用这个方法找到的文件是库文件──即由 OBJ文件组成的归档文件(archive file)。连接器处理归档文件的方法是:扫描归档文件,寻找某些成员,这些成员的符号目前已被引用,不过还没有被定义。但是,如果连接器找到普通的 OBJ 文件,而不是库文件,就把这个OBJ文件按平常方式连接进来。指定-l'选项和指定文件名的唯一区别是,-l’选项用lib'和.a’把library包裹起来,而且搜索一些目录。
    4)-static
    在支持动态连接(dynamic linking)的系统上,阻止连接共享库。
    5)-shared
    生成一个共享 OBJ 文件,它可以和其他 OBJ 文件连接产生可执行文件。只有部分系统支持该选项。

  2. 目录选项(Directory Option)
    下列选项指定搜索路径,用于查找头文件,库文件,或编译器的某些成员。
    1)-Idir
    在头文件的搜索路径列表中添加 dir 目录。
    头文件的搜索方法为:如果以“#include <>”包含文件,则只在标准库目录开始搜索(包括使用-Idir 选项
    定义的目录);如果以“#include “””包含文件,则先从用户的工作目录开始搜索,再搜索标准库目录。
    2)-I-
    任何在-I-'前面用-I’选项指定的搜索路径只适用于#include "file"'这种情况;它们不能用来搜索#include '包含的头文件。如果用-I'选项指定的搜索路径位于-I-'选项后面,就可以在这些路径中搜索所有的#include'指令(一般说来-I 选项就是这么用的)。还有,-I-'选项能够阻止当前目录(存放当前输入文件的地方)成为搜索#include "file"'的第一选择。-I-'不影响使用系统标准目录,因此,-I-'和-nostdinc’是不同的选项。
    3)-Ldir
    在`-l’选项的搜索路径列表中添加 dir 目录。

2 实验代码

2.1 源程序:

int main()
{
return 0;
}

2.2 预处理操作

gcc -E -o test.i test.c

2.3 预处理、编译操作

gcc -S -o test.s test.c

2.4 预处理、编译、汇编操作

gcc -c -o test.o test.c

2.5 预处理、编译、汇编、链接操作

gcc test.cgcc test.c -o test

如果不指定输出文件,则默认输出 a.out。

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

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

相关文章

mysql DBA常用的sql

是否一般查询日志&#xff0c;默认关闭 show variables like ‘general_log’; 是否开启慢日志查询 默认关闭 show global variables like ‘slow_query_log’; 开启慢日志查询 SET GLOBAL slow_query_log ‘ON’; 默认是10 单位s SELECT long_query_time; 设置超过1s就算…

maya-vray渲染蒙版

要用一个叫vrayMulWrapper的材质球&#xff0c;把alpha Conterbution调到-1&#xff0c;勾选matte surface启用蒙版物体。

VLDB 超级大表上没有index 还需要gather statistics吗?

文档指明这个问题不属于DBA的问题,而是属于DW的问题,超大表的情况,statistics 要分析,而且不能留给夜晚的job去跑。 Do I need to gather statistics on an Oracle table that has no index? I have an Oracle 11g DB, and some of the tables are truncated and re-impo…

【GESP】C++一级练习BCQM3005,基本输出语句printf

一道基础练习题&#xff0c;练习基本输出语句printf。 BCQM3005 题目要求 描述 输出表达式1234∗5678的结果。 输入 无 输出 1234∗56787006652 输入样例 无 输出样例 1234 * 5678 7006652 全文详见个人独立博客&#xff1a;https://www.coderli.com/gesp-1-bcqm3005/ 【…

在树莓派上构建和部署 Node.js 项目

探索在Raspberry Pi上构建和部署Node.js项目的最佳实践。通过我们的专业提示和技巧&#xff0c;克服常见挑战&#xff0c;使您的项目顺利运行。 去年圣诞节&#xff0c;我收到了一份极其令人着迷的礼物&#xff0c;它占据了我许多周末的时间&#xff0c;甚至让我夜不能寐。它就…

零基础考过软考信息系统项目管理师经验分享

选择适合的课程&#xff1a;如果你是零基础&#xff0c;建议找一些专门针对新手的课程&#xff0c;讲解通俗易懂。 刷题至关重要&#xff1a;软考的题库很庞大&#xff0c;多做题是必须的。 做好笔记和复习&#xff1a;上课时要做好笔记&#xff0c;课后及时复习&#xff0c;…

网络安全学习(二)初识kali

kali有两种界面模式&#xff0c;为了更好的适应windows用户&#xff0c;需要操作一下。 先更新一下kali&#xff0c;执行命令 sudo apt-get update 然后换界面 sudo apt install kali-desktop-gnome 等待&#xff0c;出现如下界面时&#xff0c;选择gdm3&#xff08;键盘&a…

Mybatis中Like模糊查询三种处理方式

目录 Mybatis中Like模糊查询三种处理方式 1.通过单引号拼接${} 1&#xff09;mapper接口 2&#xff09;Mapper.xml 3&#xff09;测试代码 4) 测试结果 2.通过concat()函数拼接(个人推荐使用这种) 1&#xff09;mapper接口 2&#xff09;Mapper.xml 3&#xff09;测试代码 4) 测…

jvm学习记录01

目录标题 jvm和java的体系结构架构模型jvm生命周期启动执行结束 hotspot jvm和java的体系结构 架构模型 1基于栈的指令集架构2基于寄存器的指令集架构 两者区别&#xff1a; 基于栈式架构的特点 设计和实现更简单&#xff0c;适用于资源受限的系统; 避开了寄存器的分配难题:…

Requests-HTML模块怎样安装和使用?

要安装和使用Requests-HTML模块&#xff0c;您可以按照以下步骤进行操作&#xff1a; 打开命令行界面&#xff08;如Windows的命令提示符或Mac的终端&#xff09;。 使用pip命令安装Requests-HTML模块。在命令行中输入以下命令并按回车键执行&#xff1a; pip install request…

工厂模式(一):简单工厂模式

一、概念 顾名思义&#xff0c;带着工厂&#xff0c;两字肯定就是有标准、快速、统一等等一些工厂独有的特点。 那么什么是简单工厂模式呢&#xff1f; 定义&#xff1a;简单工厂模式是一种创建对象的设计模式&#xff0c;它定义了一个工厂类通过某个静态方法来生成不同类型的…

熵权法详细讲解+Python代码实现

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

C#/.NET/.NET Core技术前沿周刊 | 第 5 期(2024年9.9-9.15)

前言 C#/.NET/.NET Core技术前沿周刊&#xff0c;你的每周技术指南针&#xff01;记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿&#xff0c;助力技术成长与视野拓宽。 欢迎投稿&…

油烟净化器选购指南:高效净化与优质服务并存的选择

我最近分析了餐饮市场的油烟净化器等产品报告&#xff0c;解决了餐饮业厨房油腻的难题&#xff0c;更加方便了在餐饮业和商业场所有需求的小伙伴们。 随着环保政策的不断强化和人们对健康生活环境的追求&#xff0c;油烟净化器已经成为餐饮行业和家庭厨房的必备设备。然而&am…

Docker安装mysql安装nginx安装Redis

Docker安装mysql 下载镜像 docker pull mysql:8.0注意,使用此方法安装镜像需要提前配置镜像源,详情看之前的文章 安装 docker run -d -p 3306:3306 \ --name mysql \ --restartalways \ --privilegedtrue \ -e TZAsia/Shanghai \ -e MYSQL_ROOT_PASSWORDroot \ mysql:8.0进…

[网络]https的概念及加密过程

文章目录 一. HTTPS二. https加密过程 一. HTTPS https本质上就是http的基础上增加了一个加密层, 抛开加密之后, 剩下的就是个http是一样的 s > SSL HTTPS HTTP SSL 这个过程, 涉及到密码学的几个核心概念 明文 要传输的真正意思是啥 2)密文 加密之后得到的数据 这个密文…

【南方科技大学】CS315 Computer Security 【Lab2 Buffer Overflow】

目录 引言软件要求启动虚拟机环境设置禁用地址空间布局随机化&#xff08;ASLR&#xff09;设置编译器标志以禁用安全功能 概述BOF.ctestShellCode.c解释 createBadfile.c 开始利用漏洞在堆栈上查找返回地址 实验2的作业 之前有写过一个 博客&#xff0c;大家可以先看看栈溢出…

【裸机装机系列】2.kali(ubuntu)-裸机安装kali并进行磁盘分区-2024.9最新

【前言】 2024年为什么弃用ubuntu,请参考我写的另一篇博文&#xff1a;为什么不用ubuntu&#xff0c;而选择基于debian的kali操作系统-2024.9最新 【镜像下载】 1、镜像下载地址 https://www.kali.org/get-kali/选择installer-image&#xff0c;进入界面下载相应的ISO文件 我…

【Android 13源码分析】WindowContainer窗口层级-2-构建流程

在安卓源码的设计中&#xff0c;将将屏幕分为了37层&#xff0c;不同的窗口将在不同的层级中显示。 对这一块的概念以及相关源码做了详细分析&#xff0c;整理出以下几篇。 【Android 13源码分析】WindowContainer窗口层级-1-初识窗口层级树 【Android 13源码分析】WindowCon…

学习整理vue前端框架项目目录结构的含义

学习整理vue前端框架项目目录结构的含义 1、目录结构2、结构含义 1、目录结构 2、结构含义