快速认识一下
C语言推荐gcc
c++语言推荐g++
两者的差别不大主要
c++语言:
C语言
程序编译的过程
我们大概知道 C语言 ->汇编语言->二进制,
这个只是大概说明了先有语言再有编译器,由于各种原因,这些编译器可能就不是用这些语言来写的了
预处理
- 头文件展开
- 去注释
- 宏替换
- 条件编译
我们知道在头文件进行写入条件编译主要就是防止头文件重复包含
这个过程只是进行一系列操作,语言没有改变
gcc -E code.c -o code.i
编译
C语言翻译成汇编语言
gcc -S code.i -o code.s
汇编
汇编语言翻译成二进制
gcc -c code.s -o code.o
需要注意的是这个code.o文件不是可执行文件,不能执行
链接
gcc code.o -o code
执行code文件就可以了
./code
动静态标准库----链接
我们可以使用下面指令,可以查看code文件用到了哪些库
ldd code
Linux中的c标准库就是libc.so.6
不同的系统的库的后缀是不太一样的
在linux 系统下安装了C语言的头文件
ls /usr/include/
也安装了C标准库
ls /lib64/linc
如果平台要支持开发就要提前在系统中安装语言头文件和库文件
简单的理解就是动静态库本身就是一个文件,头文件也是文件
这个图可以帮助我们理解动态库的使用,你是一名学生,你的作业就是执行代码,但是你需要上网才能完成作业,但是你不知道网吧地址,可是学长告诉你了,你就会去这个地方去上网,上完网后,你就会回来继续写作业,直到完成,
而静态库的就是我们链接的时候我们把需要用到的方法直接拷贝到可执行程序,不受静态库的影响,哪怕静态库出来问题也不影响可执行程序。
简单的理解就是允许我们拷贝的库就是静态库,允许我们链接的就是动态库
平时我们使用的函数也称为库函数
动态库
大致意思:在程序链接的时候只是作些标记(地址),然后在程序开始启动运行的时候,动态地加载所需库(模块)也是就通过地址找到对应的模块,
优点:
- 节省资源(包括内存、网络…等资源),不会出现重复代码(只要没有重复,所有的花费都是必要的)
缺点:
- 对库的依赖性比较强,一旦库丢失,所有使用这个库的程序就会无法允许
例子:
gcc code.c -o code.out ldd code.out file code.out
静态库
大概:只用于链接生成可执行文件阶段。链接器会将程序中使用到函数的代码从库文件中拷贝到应用程序中,一旦链接完成生成可执行文件之后,在执行程序的时候就不需要静态库了
优点
- 不依赖库,同类型平台中都可以运行使用
缺点
- 可执行程序体积比较大,比较浪费资源
如果没有安装过静态库就会报错
ld就是链接器
我们需要先安装C语言静态库
sudo yum install glibc-static
c++的静态库就是
sudo yum install libstdc++-static
然后进行文件链接就可以了
gcc Newcode1.c -o newcode_static -static
可以看到我们使用ldd指令查看链接的库,可以发现,链接的是静态库
这个图也可以说明,同一个文件进行不同的链接,大小会改变,静态链接的可执行文件的大小更大