【从零开始的嵌入式生活】LinuxC语言4——LinuxC高级(1)

简介: 【从零开始的嵌入式生活】LinuxC语言4——LinuxC高级(1)

文章目录

 前言

 GCC和GDB

      GCC编译器

         GNU工具

         GCC工具

         所支持的后缀

         编译器的主要组件

         GCC的基本用法和选项

         GCC编译过程

      GDB调试工具

 条件编译和结构体

      条件编译

      结构体

          定义一个结构体类型的一般形式为:

          **定义结构体变量方法**

          结构体的大小

          结构体变量的使用形式

          结构体变量的初始化

      结构体数组

                定义

                初始化

                使用

      结构体指针

 共用体和typedef

      共用体

                定义

      赋值

      typedef 改名

 内存管理

      静态存储分配

      动态存储分配

      malloc/free

      野指针

 写在最后

GCC和GDB

GCC编译器

GNU工具

编译工具:把一个源程序编译为一个可执行程序

调试工具:能对执行程序进行源码或汇编级调试

软件工程工具:用于协助多人开发或大型软件项目的管理,如make、CVS、Subvision

其他工具:用于把多个目标文件链接成可执行文件的链接器,或者用作格式转换的工具。

GCC工具

全称为GNU CC ,GNU项目中符合ANSI C标准的编译系统

编译如C、C++、Object C、Java、Fortran、Pascal、Modula-3和Ada等多种语言

GCC是可以在多种硬体平台上编译出可执行程序的超级编译器,其执行效率与一般的编译器相比平均效率要高20%~30%

一个交叉平台编译器 ,适合在嵌入式领域的开发编译

所支持的后缀

.c C原始程序

.C/.cc/.cxx C++原始程序

.m Objective-C原始程序

.i 已经过预处理的C原始程序

.ii 已经过预处理的C++原始程序

.s/.S 汇编语言原始程序

.h 预处理文件(头文件)

.o 目标文件

.a/.so 编译后的库文件

编译器的主要组件

分析器: 分析器将源语言程序代码转换为汇编语言。因为要从一种格式转换为另一种格式(C到汇编),所以分析器需要知道目标机器的汇编语言。

汇编器: 汇编器将汇编语言代码转换为CPU可以执行字节码。

链接器: 链接器将汇编器生成的单独的目标文件组合成可执行的应用程序。链接器需要知道这种目标格式以便工作。

标准C库: 核心的C函数都有一个主要的C库来提供。如果在应用程序中用到了C库中的函数,这个库就会通过链接器和源代码连接来生成最终的可执行程序。

GCC的基本用法和选项

Gcc最基本的用法是∶gcc [options] [filenames]


-c,只编译,不连接成为可执行文件,编译器只是由输入的.c等源代码文件生成.o为后缀的目标文件,通常用于编译不包含主程序的子程序文件。

-o output_filename,确定输出文件的名称为output_filename,同时这个名称不能和源文件同名。如果不给出这个选项,gcc就给出预设的可执行文件a.out。

-g,产生符号调试工具(GNU的gdb)所必要的符号资讯,要想对源代码进行调试,我们就必须加入这个选项。

-O,对程序进行优化编译、连接,采用这个选项,整个源代码会在编译、连接过程中进行优化处理,这样产生的可执行文件的执行效率可以提高,但是,编译、连接的速度就相应地要慢一些。

-O2,比-O更好的优化编译、连接,当然整个编译、连接过程会更慢。

-I dirname,将dirname所指出的目录加入到程序头文件目录列表中,是在预编译过程中使用的参数。

-L dirname,将dirname所指出的目录加入到程序函数档案库文件的目录列表中,是在链接过程中使用的参数。

GCC编译过程


GDB调试工具

首先使用gcc对test.c进行编译,注意一定要加上选项‘-g’


gcc -g test.c -o test
gdb test


调试信息:

61ad872d21f97bfd101c8f03d47e470.png


注意的点:


在gcc编译选项中一定要加入‘-g’。

只有在代码处于“运行”或“暂停”状态时才能查看变量值。

设置断点后程序在指定行之前停止


相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
相关文章
|
8月前
|
存储 Shell Linux
嵌入式 Linux Shell编程
嵌入式 Linux Shell编程
|
Linux
嵌入式(六)——Linux进阶命令
嵌入式(六)——Linux进阶命令
|
存储 编译器 Linux
【从零开始的嵌入式生活】LinuxC语言4——LinuxC高级(3)
【从零开始的嵌入式生活】LinuxC语言4——LinuxC高级(3)
|
编译器 Linux 程序员
【从零开始的嵌入式生活】LinuxC语言4——LinuxC高级(2)
【从零开始的嵌入式生活】LinuxC语言4——LinuxC高级(2)
|
Shell Linux C语言
【从零开始的嵌入式生活】LinuxC语言——shell脚本编程(2)
【从零开始的嵌入式生活】LinuxC语言——shell脚本编程(2)
|
机器学习/深度学习 存储 物联网
【从零开始的嵌入式生活】LinuxC语言——shell脚本编程(1)
【从零开始的嵌入式生活】LinuxC语言——shell脚本编程(1)
【从零开始的嵌入式生活】LinuxC语言——shell脚本编程(1)
|
存储 Unix Linux
【从零开始的嵌入式生活】LinuxC语言——shell命令(2)
【从零开始的嵌入式生活】LinuxC语言——shell命令(2)
【从零开始的嵌入式生活】LinuxC语言——shell命令(2)
|
Linux Shell 数据安全/隐私保护
【从零开始的嵌入式生活】LinuxC语言——shell命令(1)
【从零开始的嵌入式生活】LinuxC语言——shell命令(1)
【从零开始的嵌入式生活】LinuxC语言——shell命令(1)
|
存储 网络协议 Linux
【从零开始的嵌入式生活】LinuxC语言——shell命令(3)
【从零开始的嵌入式生活】LinuxC语言——shell命令(3)
【从零开始的嵌入式生活】LinuxC语言——shell命令(3)
|
算法 Linux 编译器
【从零开始的嵌入式生活】LinuxC语言5——Makefile(2)
【从零开始的嵌入式生活】LinuxC语言5——Makefile(2)