1、什么是交叉编译
gcc是一个交叉平台编译器,它能够在当前CPU平台上为多种不同体系结构的硬件平台开发软件
gcc特点:①可以开发多种语言②是一款交叉编译器
PC:x86体系结构 例如x86平台下边溢出的可以在arm下运行
2、编译器gcc -编译选项
一个.c源文件在编译器的编译过程①预处理 1、头文件展开 2、宏替换 3、条件编译 gcc -E 文件名(只进行预处理操作) gcc -E demo2.c > demo2.i经过预处理后文件后缀为.i
/usr/include/(系统存放头文件目录) #if/#endif等 > 重定向
②编译 gcc -c 文件名:生产.o目标文件 语法检测、词法分析
③汇编 gcc -S 文件名 .s汇编文件后缀 将编译文件编写成汇编文件
④链接 链接就是链接器ld将各个目标文件组装在一起,解决符号依赖,库依赖关系,并生成可执行文件
arm-linux-gcc 文件名:在arm下生成的
头文件 ①<>搜索路径是系统的头文件目录,找不到就报错
②“ ”搜索路径先在当前.c目录下找,找不到再到系统头文件目录下找,找不到就报错
大段注释:
#if 0(若要执行改为1)
……
#endif
gcc hello.c -o hello 给可执行文件重起名字 或者gcc -o hello hello.c
*通配符
DSP处理器(图像处理)
time ./文件名 可以看到执行时间
gcc -O1 .c源文件名 -o …… 一级优化
-O2 二级优化
-O3 三级优化
三级优化的作用:
gcc - o1 首先o1上面还有一个o0,那个是不提供任何优化,项目中几乎不会使用,而o1使用就非常广泛了,o1是最基本的优化,主要对代码的分支,表达式,常量来进行优化,编译器会在较短的时间下将代码变得更加短小,这样体积就会变得更小,会减少内存的占用率,在操作系统进行内存调度时就会更快。但是事情没有绝对的优点,当一个庞大的程序被拆碎细分的话,内存占用会大大增加,由于当今系统大多数都是多线程,就会出现卡顿和反应延迟。
gcc - o2 这个优化级别是o1的进阶,在上一级的基础上会进行更严格的细分,最重要的是加入了寄存器的使用。寄存器是cpu中重要的组成部分,此外还有运算器和控制器,计算机顾名思义,要进行各种庞杂的计算,由于cpu速度较快,所以计算的中间结果都会保存在寄存器中,这样可以大大提高系统的效率,但是寄存器造价高昂,数量有限,所以一般来说程序不会放在寄存器中,另一种将代码放在寄存器的方式是使用register修饰变量,适用于频繁调用的变量。
gcc - o3 这个优化属于非常强大的优化,因为编译器会进行预测,对循环每一层的预测,以便于将循环拆分,可以提高执行效率。编译器还会试图用已有的值来代替未知的值,并且还会用加代替乘,因为运算器的特性,乘法十分复杂耗时。当然o3的缺点最明显,那就是o3因为试图预测程序的走向,可能会出现误差,导致错误和程序不可逆转的走向。所以一般o3不建议使用。
gcc -w hello.c -o hello 关闭警告(不要使用这个代码)
gcc -Wall hello.c -o hello 开启警告
局部变量的释放 例如 static char src[100]=……;
用户自己写的头文件用“ ”,系统自带的头文件用<>
全用" "编译效率变慢
.h不在当前目录:①.c文件中直接 include " "双引号中写路径(无法移植)
②gcc main.c add.c -o add -I../ 指定头文件的第三方搜索路径(大写的i)
gcc main.c -I../ -DMAX=100 外部定义一个宏MAX
add.h中为 int add(int a, int b);
-static 编译器静态库 指定生成静态链接库
例如gcc main.c -lhello.c -L. -static -o main
3、静态库与动态库的制作与使用
什么是库文件:能使用但看不到变量的定义与函数的实现
静态库:后缀.a 在执行程序之前就已经加入到执行代码中,成为执行程序的一部分来执行
动态库:后缀.so(共享库)在执行程序启动时加载到执行代码中
路径:①/lib/ 放系统启动自带的库文件 ②/usr/lib 放一些应用和软件再带的库文件
区别:①执行速度上 静态库执行速度快 动态库执行速度慢
②编译速度上 静态库编译速度慢 动态库编译速度快
③占用内存上 静态库可执行文件占用内存大 动态库可执行文件占用内存小
④升级上 静态库需要卸载原来的可执行文件然后重新下载 动态库可以直接下载需要的文件
⑤可执行文件的部署上 静态库方便部署 动态库不方便部署
静态库的创建:①gcc -c add.c②ar rcs libadd.a add.o③gcc main.c -ladd -L/root/1111
指定搜索路径
写程序要写readme 使用文档
例如int add(int a, int b); //实现两数相加
动态库的创建:
①gcc -shared -fPIC -o libadd.so add.c②gcc main.c /root/1111/libadd.so -o add
printf scanf等封装在 libc.a libc.so中
数学库:libm.a libm.so 运行时gcc main.c -lm