一.gcc编译代码
1.1gcc的使用
gcc只能用来编译C语言
touch code.c 创建文件
利用vim打开
gcc code.c 编译代码,生成a.out文件
./a.out运行代码
如果有编译报错的情况,因为有的编译器可以能是版本的问题
可以在后面加上gcc code.c -std=c99
如果我不想使用编译器自己生成的可执行文件的名称该怎么办呢?
gcc code.c -o mybin.exe
把名字更改就行
二.程序翻译过程
1.1编译器
人们最开始在编译的时候是用打孔带直接给cpu输入二进制指令
但这种方式效率比较低
后来就发明汇编语言
但计算机不认识汇编语言就需要编译器来翻译
人们就用二进制写一个编译器然后把汇编语言翻译成二进制
汇编语言用着也不是很好,人们就发明了c语言,C++等等
c语言出来后就遇到一个问题
使用c语言来写一个C语言编译器还是用其他语言来写一个C语言编译器
用c语言编写编译器计算机是读不懂的,这时就用汇编语言来编写
把c语言翻译成汇编语言,汇编语言再翻译成二进制
1.2语言/编译器自举的过程
用二进制编译一个汇编编译器,再用汇编语言编译一个汇编编译器
用汇编语言编译一个c语言编译器,再用c语言编译一个c语言编译器
编译器也是软软件
1.3预处理 编译 汇编 链接
预处理:
1.头文件展开
复制头文件
-E的作用是:从现在开始帮我进行程序的翻译,等预处理做完你就停下来不要再往后执行
-o code.i将头文件展开的内容写到指定的源文件中
vim code.i进入源文件
头文件展开把stdio.h头文件内容拷贝到了源文件里
vim /etc/include/stdio.h进入头文件这里面就是
头文件展开的内容都复制到源文件里面了
编译器都有自己的默认搜索路径不用担心编译器能不能找到stdio.h头文件
2.去注释 宏替换
3.条件编译
当#define是 V1是,条件编译后的结果是普通用户
当#define是V2,条件编译后的结果是VIP
默认情况,超级VIP
通过条件编译可以实现对代码的动态裁剪
这就是为什么xshell有免费版和付费版的区别
编译:
编译原文件形成汇编语言
-S的作用的是:从现在开始进行程序的翻译,等编译工作完成就停下来
vim code.s打开汇编文件
汇编:
把汇编编程可重定位二进制文件
-c的作用是:汇编做完就停下来
vim code.o打开二进制文件
全是乱码
od.code.o查看二进制
code.o现在并不能执行
链接:
动态链接:把要链接的库中的函数地址拷贝到可执行程序的特定为止
形成的可执行程序体积比较小,节省资源,较慢,依赖动态库,动态库没有所有的依赖这个库的程序都无法运行
静态链接:把目标文件.o 和 静态库 .a ,使用 ld 链接器,链接生成一个可执行程序
默认情况下,云服务器没有安装c静态看的只有动态库sudo yum install glibc-static
c++的静态库sudo yum install -y libstdc++static
无视库可以独立运行,体积太大,浪费资源
形成可执行
*.o+系统库 = 可执行程序
总结:1.gcc code.c -o mybin直接使用这种快捷方式
2.-E翻译过程 S预处理过程 C编译汇编过程
code.i 原文件 code.s汇编文件 code.o二进制文件(iso)
三.动静态库
3.1头文件
我们现在所写的所有代码都是站在巨人的肩膀上
已经有人给我们写好了对应的可以直接使用的函数
哪这些函数存放在哪里了?
我们都知道函数有个库存放在库里,哪这个库在哪呢?
头文件在Linxu系统中都有预装
ls /usr/include/查看头文件
3.2库文件
ldd查看一个可以执行程序依赖的第三方库
ldd mybin
可以看到mybin依赖库的路径/lib64/libc.so.6
ls /lib64/libc.so.6
Linux系统也提前给我们预装了库
可执行程序 = 头文件(提供方法的声明) + 库文件(提供方法的实现)
我们在第一次安装vs会选择这个选项安装c和c++安装包
这个安装包就包含了头文件库和函数库
安装下载并拷贝头文件和库文件到开发环境中的特定路径下
一定要被编译器自己找的到
库的命名
libc.so.6
以lib开头,so库的类别区分动静态库,6版本号
c表示库的名字,C标准库
库的分类
.so:动态库(.dll)
是c/c++或者其他第三方提供的所有方法的集合,被所有程序以链接的方式,关联起来
.a:静态库(.lib)
是c/c++或者其他第三方提供的所有方法的集合,被所有程序以拷贝的方式,将需要的代码
拷贝到自己的可执行程序中
3.3开发环境
1.下载开发环境include,lib
2.设置合理的查找路径
3.规定好我们形成可执行程序的链接方式
本小节完结,点个赞和关注吧!!!