苏嵌12 16.11.11

来源:互联网 发布:日本网络用语 笑 编辑:程序博客网 时间:2024/06/05 00:45

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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 房子已过户新业主不交物业费怎么办 村委会欠百姓征地补偿款不给怎么办 因为近亲人人都不看好的婚姻怎么办 碰到工作中特别积极的同事怎么办 丈夫车祸死亡妻子和孩子以后怎么办 丈夫死后妻子改嫁儿子不同意怎么办 满了60岁社保没满15年怎么办 捷豹的dpf灯亮了怎么办 朋友如新直销产品是你该怎么办 传福音接受了却被家人拦阻该怎么办 奶奶出钱由孙子抓奖中奖后怎么办 我不想学车了驾校不同意退学怎么办 2017年大学挂科面临退学怎么办 微信重新登录后东西全没了怎么办 宝宝吃鸡蛋过敏全身起红疹怎么办 180在产蛋鸡因断鸡减产怎么办 住友39熔接机熔接损耗大怎么办 支付宝实名认证刷脸失败怎么办 支付宝注册刷脸不是本人怎么办 小学科学只考88分中学怎么办 收银机关机时才上传数据是怎么办 刚做的系统玩cf卡屏怎么办 办健康证的资料掉了怎么办 刚刚办得的健康证掉了怎么办 房子都过户了银行贷不了款怎么办 我要办大病迁出应该怎么办啊? 遗产继承后户口没地迁出怎么办 安徽蒙城怎么办去韩国的签证的 夜间有人私自收停车费应该怎么办 上次摸不到环尾丝这次摸到了怎么办 法院判决书下来后对方不给钱怎么办 法院判决书下来了钱还保全么怎么办 深圳路边泊车不知道泊车编号怎么办 当事人进拘留所了我的工资怎么办 昆明公租房住满5年后怎么办 昆明公租房房子到期缴纳金怎么办 看守所犯人银行卡里钱没用完怎么办 中国邮政迟迟没有把信件寄到怎么办 拘留15天放出来还不肯还钱怎么办 人死在拘留所不让看监控怎么办 家人吸毒可他又不愿强戒怎么办