gcc编译器

gcc编译器(编译选项 静态库和动态库的制作与使用)
1.gcc特点:能够实现交叉编译预处理,编译,汇编,链接
交叉编译:在当前cpu平台能够编译出其他cpu平台的运行代码(不同的cpu有不同的汇编)
pc:86体系结构 a.out移动终端:arm体系结构
编译过程:
在这里插入图片描述

预处理 展开头文件
1.头文件展开(vim/usr/include/stdio.h)
2.宏替换
3.条件编辑
4.预处理指令(#line、#error(不检查语法错误))
编译 将预处理后的文件进行词法分析、语法分析、语义分析及优化后,生成汇编文件 .s
汇编 生成目标文件 .o
链接 生成可执行文件
#include<stdio.h>:系统头文件目录(/usr/include)
VS
#include”stdio.h”:先在当前目录搜索,然后到系统的头文件目录
常用编译选项
-E : gcc -E 预处理阶段停下来
-S : gcc -S 编译阶段停下来,只做预处理和编译,把文件编译成为汇编代码
-c : gcc -c 汇编时停下来,只做预处理、编译和汇编,不链接,产生的是目标文件(.o文件)
-o : 指定程序的名字
-O : 编译器的优化选项(gcc -O1 optimize.c -o optimizel 一级优化
gcc -O2 optimize.c -o optimizel 二级优化)
-L : 指定so文件所在的目录
-l : 指定so文件的名字
gcc -Wall+文件名 打开所有警告开关
gcc -w +文件名 关警告
gcc 文件名(demo.c) -o 重命名 (demo)
静态库和动态库的制作与使用
1.什么是库文件?
保存函数和变量,只能使用不能看到其实现(SDK开发包:库文件+开发工具)
2.Linux库文件分类(使用静态库和动态库编译生成的可执行文件的优缺点)
静态库 .a:使用静态库编译程序是在编译时加载(可执行文件大,占用内存大)
优点:
1.寻址方便,速度快
2.库在链接时被打包到可执行文件中,直接发布可执行程序即可以使用
缺点:
1.静态库的代码被加载到可执行程序中,因此体积过大
2.如果静态库的函数发生改变,必须重新编译可执行程序
动态库 .so(共享库):使用动态库编译程序是在运行时加载(可执行文件小,占用内存小)
优点:
1.节省内存
2.易于更新,不用重新编译可执行程序,运行时自动加载
缺点:
延时绑定,速度略慢
静态库和动态库的区别:
使用静态库生成的文件大,编译的程序难以升级,运行速度快
在这里插入图片描述区别 1.在程序编译时载入程序的目标代码中,整个函数库的所有数据都会被整合进目标代码中,静态函数库编译成的文件比较大
2.程序运行时不再需要改静态库,体积比较大 1.在程序运行时载入程序的目标代码中,程序执行到相关函数时才调用该函数库里的相应函数,所产生的可执行文件比较小
2.程序运行时需要动态库

共同点 静态库和动态库都是闭源库,只能拿来满足某个功能的使用,不会暴露内部具体的代码信息,而从github上下载的第三方库大多是开源库。

文件名的命名 lib+静态库名+.a lib+动态库名+.so
3.Linux库文件存放位置:/lib /usr/lib
4.静态库的制作和使用
①得到*.o文件
gcc *.c -c -I…/include
②创建静态库
ar rcs libMyTest.a *.o 将所有.o文件打包为静态库,r将文件插入静态库中,c创建静态库,不管库是否存在,s写入一个目标文件索引到库中,或者更新一个存在的目标文件索引。
mv libMyTest.a …/lib 将静态库文件放置lib文件夹下
nm libMyTest.a 查看库中包含的函数等信息
③使用静态库
第一种方法:
gcc + 源文件 + -L 静态库路径 + -l静态库名 + -I头文件目录 + -o 可执行文件名
gcc main.c -L lib -l MyTest -I include -o app
./app
第二种方法:
gcc + 源文件 + -I头文件 + libxxx.a + -o 可执行文件名
gcc main.c -I include lib/libMyTest.a -o app

上一篇:编译器

代码交流 2021