嵌入式Linux开发工具-gcc(GUN cc),gcc的功能非常强大,有些编译选项我们要接触,再一个gcc最重要的就是如何制作动态库和静态库。gcc特点是GUN工具以及是一款交叉编译器。那么什么是交叉编译器呢?在PC端写的代码是不能在手机上运行的 那么交叉编译就是在当前CPU平台下编译出在其他CPU平台下可执行的代码。接下来讲下系统移植,大多数的开发端都是在windows下的虚拟机下的linux。PC端都是做开发端的,一般我们称PC端为宿主机。相应的开发板或者手机我们称为目标机。交叉编译也可理解为在宿主机上编译出可以在目标机上运行的代码。为什么会有交叉编译呢,原因是不同的处理器有不同的汇编,不同的汇编生成的可执行文件只能被当前的CPU执行。
我们知道源文件到可执行文件需要经过预处理,编译,汇编,链接。那么每个阶段又需要做什么事情呢,首先预处理阶段做的有三件事,头文件展开,宏替换,条件编译。在头文件展开中有下面一行代码,gcc -E (文件名.c)这个指令的作用是编译文件的时候只进行预处理,其它的操作都不进行。在C语言中,有用<>包含一个头文件,也有用"“包含一个头文件,那么它们有什么区别?其实它们的区别在于它们的搜索路径不同,<>在系统的头文件目录查找。而”"先在当前目录查找,找不到再到头文件目录查找。编译呢是将预处理文件编译成汇编文件,后缀.s。汇编是汇编文件编译生成目标文件,后缀.o。链接是建立符号表,最终生成可执行文件a.out。在Linux命令中-O是重命名可执行文件。在编写代码的时候,如果很难避免出现警告,要想不被警告打扰可以选择-w来去掉警告。当然这种方法要慎用。如果选择开警告可以用-Wall。在运行代码的时候我们也会用到优化,有一级优化-o1,二级优化-o12,三级优化-o3。
再一个重要的内容是如何制作静态库和动态库。那么什么是库文件?它其实是保存函数和变量,起到一个仓库的作用。其特点是保存的函数及变量只能使用但不能看到其实现。Linux库文件分为静态库后缀.a和动态库后缀.so。两者的区别在于,静态库是在编译阶段加载,而动态库是在运行时加载。加载的意思是将库文件的代码加载到源文件。这样导致的结果是生成的可执行文件存在区别。第一,使用静态库生成的可执行文件大于动态库生成的。因为我们在编译的时候就已经把所有内容加载进来了。导致的问题是程序运行占用的内存较多。一般不采用静态库。第二个区别就是使用静态库生成的可执行文件难以升级,使用动态库生成的可执行文件易于升级。第三个区别是静态库生成的可执行文件运行速度快,使用静态库库生成的可执行文件运行速度慢。第四个区别就是使用动态库可执行文件里的代码容易部署,而动态库难以部署。一般情况下,优先选择动态库,占用内存小,易于升级。
接下来了解下Linux库文件存放的路径。一个是/lib存放的是系统运行所需要的库。另一个是/usr/lib存放的是程序运行所需要的库。
如何制作静态库呢?首先将需要保存的函数所在的文件编译生成目标文件。第二个静态库的常用制作工具ar。ar rcs(不存在就创建,存在就更新)后面跟上库名 和 目标文件名。使用方法是gcc 源文件 -l库名 -L库存放的路径。以上就是静态库的制作步骤。
如何制作动态库?如下,gcc -shared -fPIC源文件 -o libcal.so(库的名字),方法和静态库差不多。使用为cp libcal.so/usr/lib然后gcc main.c -lcal就可以了。或者gcc main.c ./libcal -o cal。以上就是总结的所有内容。
嵌入式第三周总结
最新推荐文章于 2022-11-07 20:39:33 发布