苏嵌12 16.11.11

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值