当前位置: 首页 > article >正文

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.c

gcc test.c -o test

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


http://www.kler.cn/news/312551.html

相关文章:

  • 优化 Elasticsearch 集群性能:解决节点压力不均衡问题及分片策略调整
  • git统计代码行数、提交数
  • 每日OJ题_牛客_WY22 Fibonacci数列(斐波那契)
  • 解决uniapp视频video组件进入全屏再退出全屏后,cover-view失效的问题
  • C++——用选择法对10个数值进行排序。
  • 即时通讯框架MobileIMSDK的H5端开发快速入门
  • Python数据分析案例60——扩展变量后的神经网络风速预测(tsfresh)
  • 系统架构设计师:系统架构设计
  • etcd二次封装
  • Docker上安装mysql
  • MySQL在大数据场景应用
  • 代码随想录训练营 Day60打卡 图论part10 SPFA算法 Bellman-Ford 之判断负权回路 Bellman-Ford 之单源有限最短路
  • vue常用业务场景
  • 通过springcloud gateway优雅的进行springcloud oauth2认证和权限控制
  • Python编码系列—Python代理模式:为对象赋予超能力的魔法
  • QTcpSocket和QLocalSocket详解
  • 【网络编程】socket套接字|sockaddr|sockaddr_in|通信过程
  • 《深度学习》—— 神经网络模型中的损失函数及正则化惩罚和梯度下降
  • 如何搭建虚拟机Ubuntu?
  • icpc江西:L. campus(dij最短路)
  • el-input 只能输入数字和一个小数点,或者只能输入两位小数
  • OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【时间管理】
  • 探索自闭症寄宿学校的专属教育模式
  • java原子操作类
  • 基于LSTM的文本摘要生成实战教程
  • Python学习的主要知识框架
  • 同样实用的CSS剪裁属性clip-path
  • esp32-C2 对接火山引擎实现语音转文本(二)
  • Windows安装启动:stable-diffusion-webui,AIGC大模型文生图、文生视频,Python
  • 使用mlp算法对Digits数据集进行分类