嵌入式(十一)——gcc常用编译选项

编译器gcc

1.1 gcc概述

GNU计划提供编译器(unix cc编译器) (编译工具链) --> (交叉编译工具链)

1.2 什么是交叉编译

图解
交叉编译:在宿主机下编程出在目标机下运行的代码的过程
通俗地讲,就是在当前CPU平台下编译出在其他CPU平台运行的代码的过程
Linux上查看编译器:arm-linux-gnueabihf-

1.3 源文件到可执行经历步骤

预处理、编译、汇编、连接(.c -> .s -> .o -> elf)

  • 预处理的任务:头文件展开(#include)、宏替换(#define)、条件编译(#ifdef、#ifndef) (#开头代码)
  • 编译的任务:检查语法、转成汇编、生成汇编文件(.s/.S)
  • 汇编的任务:编译汇编文件,生成目标文件(.o)
  • 链接的任务:链接所有目标文件,生成符号表,生成可执行文件

1.4 编译选项

-o(可执行重命名:elf)

什么是elf格式
一种Linux下常用的可执行文件、对象、共享库的标准文件格式
还有许多其他可执行文件格式: PE、Mach-O、COFF、 COM…
ELF中的数据按照Segment和Section两 个概念进行划分

-E:只进行预处理(例:gcc -E hello.c > hello.i)
头文件路径:/usr/include/stdio.h(用vim打开)
<>与"":搜索路径不同
<>:在系统文件路径(usr/include)搜索,若没有,则报错
“”:于现在当前目录查找,若没有再到系统头文件目录查找,若没有,就报错
规范:<>包含系统头文件、""包含自定义文件
.h声明函数文件,.c编写函数文件(如add.h,add.c)则(gcc hello.c add.c -o hello)

如果add.c不在当前目录
-I 指定头文件第三方搜索路径(gcc -I/root/205/1105/test hello.c add.c -o hello)
-S (进行编译阶段)(-E是为了检查那些复杂的宏)(gcc -S -I./test hello.c add.c)
-c (进行汇编阶段)(gcc -c -I./test hello.c add.c)

-O1 -O2 -O3(编译优化)

一级优化(gcc -O1 optimize.c -o optimize1)
二级优化(gcc -O2 optimize.c -o optimize1)
三级优化(gcc -O3 optimize.c -o optimize1)
编译如何优化的:
gcc编译优化-O0 -O1 -O2 -O3 -OS解析

-w (关闭警告warning)禁用
-Wall (全打开warning)
以后程序:gcc -Wall -O3 demo.c -o demo

gcc中>

属性:管道
作用:输出结果重定向
gcc -E hello.c > hello.i

x86复杂指令集、ARM精简指令集
注意:局部变量地址(可加static)

posted @ 2022-01-08 17:35  周末不下雨  阅读(48)  评论(0编辑  收藏  举报