目录
1.代码的编译过程
在学习gcc/g++之前我们先要了解代码的编译过程以及过程中具体发生过什么行为
1.1预处理
头文件展开 宏替换 去注释 条件编译
1.2编译
C 语言 -> 汇编语言
1.3 汇编
汇编语言 -> 可重定位二进制文件(现在的二进制文件不可以执行)
1.4链接
链接系统库形成可执行程序
2.gcc具体编译过程
gcc编译的过程也就对应了上面过程
2.1预处理
以code.c文件为例子
通过-E选项生成code.i文件
gcc -E code.c -o code.i
2.2编译
通过-S选项生成code.s文件
gcc -S code.i -o code.s
2.3汇编
通过-c选项生成code.o文件
gcc -c code.s -o code.o
2.4链接
最后链接不加选项生成可执行程序
gcc code.o -o code.exe
记忆技巧: 编译选项依次对应了键盘左上角的Esc键,形成的文件对应iso,其中只有Esc中的ES为大写其余为小写
3.动静态库
我们的可执行程序 = 我们的代码 + 头文件 + 库
我们的 C 程序中,并没有定义 “printf” 的函数实现 , 且在预编译中包含的 “stdio.h” 中也只有该函数的声明 , 而 没有定义函数的实现, 那么 , 是在哪里实 “printf” 函数的呢 ?最后的答案是 : 系统把这些 函数实现 都被做到名为 libc.so.6 的 库文件 中去3.1库
ldd 指令查看依赖的库文件
其中对应的库就在 lib64/libc.so.6 路径下动静态库 区别:.so -> 动态库 .a -> 静态库3.2动态库
1.名字
去掉前缀后缀剩余的就是名字这其实就是大名鼎鼎的 C标准库!!!2.链接方式
所有程序以动态链接的方式和动态库关联起来动态链接:库中所有的函数都有入口地址,所谓动态链接就是将库函数的 地址拷贝在可执行程序的特定位置!3.优点
形成的可执行程序 体积小,节约资源4.缺点
特别依赖动态库, 动态库没了,程序就无法运行3.3静态库
静态库和上面一样的命名规则1.链接方式
被程序将 代码拷贝到自己的可执行程序中(静态链接)2.优点
可以 无视库的存在独立运行3.缺点
体积太大,浪费资源3.4代码验证
因为他们的链接方式不一样,所以他们的体积也不一样所以可以在 可执行文件的大小中体现出来
以不同的方式进行编译同一个文件大小差异很大,这还是在我代码量很少的情况下
就是因为他们的优缺点,所以系统一般 默认没有静态库所以需要安装sudo yum install -y glibc-static //c静态库 sudo yum install -y libstdc++-static //c++静态库
g++用法和gcc一样