【苏嵌实训-嵌入式 linux C 第 4 天】

 

项目开发日报表

 

 

 

项目名称

 

【苏嵌实训-嵌入式 linux C 第 4 天】

 

今日进度以及任务

1. gcc 编译器的命令选项、gcc 编译优化
2. 制作静态库、动态库
3. gdb 调试指令
4. 用 make 自动编译工程,写 Makefile

 

 

 

本日任务完成情况

 

  1. 练习使用 gcc 编译程序, -E,-c,-o,-D,-I等选项
    2. 学会制作静态库和动态库,
  2. 学习 gdb 命令 
    3. 练习使用make

4.自学cmake 

 

 

 

本日开发中出现的问题汇总

课后作业cmake卡住,出现报错无法进行,具体在下面作业中说明报错情况。

 

本日未解决问题

Cmake自学任务未完成。

 

 

 

 

本日开发收获

1. gcc 编译器的命令选项、gcc 编译优化
2. 制作静态库、动态库
3. gdb 调试指令
4. 用 make 自动编译工程,写 Makefile

 

 

其他

 

 

  1. 编译器三级优化分别优化了哪些?

GNU编译器提供-O选项供程序优化使用:

-O 提供基础级别的优化

-O2 提供更加高级的代码优化,会占用更长的编译时间

-O3 提供*的代码优化

-O4 不优化,这是默认值

 

第一级:代码调整

代码调整是一种局部的思维方式;基本上不触及算法层级;它面向的是代码,而不是问题; 所以:语句调整,用汇编重写、指令调整、换一种语言实现、换一个编译器、循环展开、参数传递优化等都属于这一级;这个级别试图执行9种单独的优化功能:

 

-fdefer-pop

-fmerge-constans

-fthread-jumps

-floop-optimize

-fif-conversion: if-then

-fif-conversion2

-fdelayed-branch

-fguess-branch-probability

-fcprop-registers

第二级:新的视角

新的视角强调的重点是针对问题的算法;即选择和构造适合于问题的算法;(冒泡排序还是快排的选择问题是这一级早就应该完成的)很多经典算法都对问题作了一些假设(包括我们当前已经完成的算法实现),而在面对实际问题时“新的视角”提示我们应该重新检视这些假设,并尝试不同的思考问题的角度,寻求适合于问题的新算法; 编译器还试图采用以下几种优化。

10. -fforce-mem

11. -foptimize-sibling-calls

12. -fstrength-reduce

13. -fgcse

14. -fcse-follow-jumps

15. -frerun-cse-after-loop

16. -fdelete-null-pointer-checks

17. -fextensive-optimizations

18. -fregmove

19. -fschedule-insns

20. -fsched-interblock

21. -fcaller-saves

22. -fpeephole2

23. -freorder-blocks

24. -fstrict-aliasing

25. -funit-at-a-time

26. -falign-functions

27. -fcrossjumping

 

第三级:表驱动状态机

将问题抽象为另一种等价的数学模型或假想机器模型,比如构造出某种表驱动状态机;这一级其实是第二级的延伸,只是产生的效果更加明显,但它有其本身的特点(任何算法和优化活动都可以看作是他的投影);这一级一般可以产生无与伦比的快速程序, 要达到这一级需要大量修炼的;并且思考时必须放弃很多已有的概念或者这些概念不再重要,比如:变量、指针、空间、函数、对象等,剩下的只应该是那个表驱动状态机; 我想把这种境界描述为:空寂中,一些输入驱动着一个带有状态的机器按设定好的最短路线运转着;除此之外have nothing; 既:把解决一个问题的算法看作一个机器,它有一些可变的状态、有一些记忆、有一些按状态运行的规则,然后一些输入驱动这个机器运转;这就是第三级要求的思考优化问题的切入点,也就是寻找一部机器,使它运行经过的路径最短(可能是速度也可能是空间等等) 。编译器还试图采用以下这种优化方式。

28. -finline-functions

29. -fweb

30. -fgcse-after-reload

2、总结gcc静态库和动态库的制作;

 

1、库文件的作用?仓库:保存函数和变量;特点:只能使用不能看到其实现;

静态库.a:在编译时加载:将需要的函数或者变量,在编译过程中将其从静态库中搬迁到源文件

动态库.so:在运行时加载:将需要的函数或者变量,在运行过程中需要什么搬迁什么

 

使用静态库和使用动态库生成的可执行文件的区别(优缺点)

 

大小:静态库>动态库内存效率

 

运行速度:静态库>动态库节省了运行时间

 

编译速度:静态库<动态库

 

升级的方便程度:静态库 <动态库

 

程序的部署方便程度静态库>动态库

【苏嵌实训-嵌入式 linux C 第 4 天】

 

 

  1. 总结CMake用法;
  2. 【苏嵌实训-嵌入式 linux C 第 4 天】

 

第一行用于指定cmake最低版本
第二行指定项目名称(这个名称是任意的)
第三行指定编译一个可执行文件,hello是第一个参数,表示生成可执行文件的文件名(这个文件名也是任意的),第二个参数helloworld.cpp则用于指定源文件。

 

第二个例子就搞不出来,这段代码看不太明白,就直接照抄,cmake时报错。

【苏嵌实训-嵌入式 linux C 第 4 天】

 

报错如下:

【苏嵌实训-嵌入式 linux C 第 4 天】