.
专栏:数据结构|Linux|C语言
路漫漫其修远兮,吾将上下而求索
文章目录
gcc和g++
gcc --> c语言
g++ --> c++或者c语言
用gcc -v查看版本
如果版本过低,用gcc test.c -std = c99
让gcc支持c99
指定可执行程序的名称
gcc 运行的时候默认生成a.out文件,用 -o
+文件名可以修改,生成一个自己指定的名字
c++文件后缀名常见的几种
.cpp
.cc
cxx
使用c++11 的标准想让g++支持更高的语法特性
指定生成文件名,一样用用 -o
程序翻译的过程 - 选项
编译
运行gcc -E Test.c -o Test.i
gcc -E 表示从现在开始进行程序的翻译,预处理完成就停下
我们将Test.i打开查看,会发现里面多出来了很多东西,
那么多出来的这么东西从哪里来的呢?多出来的东西,从stdio.h头文件来的
对我们编译代码的时候,程序预处理时,会把头文件相关内容拷贝到源代码,
并且头文件可能也会包含头文件,所以可能会做一个递归程次的拷贝,这个过程我们称之为头文件展开,所以理论上只要经过预处理,头文件也就没有用到了
安装gcc或者g++时,首先会安装c和c++的头文件,而安装的时候,一般会安装到usr/include/
目录下
Linux头文件存在于Linux上的usr/include/
目录下
输入ls usr/include/
可以查看到很多头文件
条件编译
当我们宏定义v1时运行,会发现只有功能1运行了,这时候我们运行gcc -E Test.c -o Test.i
,查看Test.i的时候就会发现代码发生了裁剪,中只有v1部分了
所以很多软件,的社区版或者免费版和收费版只需要唯一一个项目;
运行结果只有功能1,这时候我们运行gcc -E Test.c -o Test.i
,查看Test.i,就会发现只剩下v1部分。
gcc -D 动态添加宏
这样就可以很方便的进行代码裁剪了
编译过程
gcc-S
从现在开始,进行程序编译,编译完成就停下来
将c语言变成汇编语言
运行gcc -S Test.i -o Test.s
把汇编文件放在Test.s文件里
汇编
gcc-c
从现在开始进行程序的翻译,汇编完成就停下来
汇编语言翻译成为,二进制目标文件
运行gcc -c Test.s -o Test.o
链接
形成可执行程序
此时我们gcc Test.o,然后就会生成可执行文件,我们把他命名为my.exe
运行my,exe
速记gcc过程-ESc
后缀名iso
链接
链接是什么?
我们的程序和库结合的过程,语言一定要有自己的标准库
查看链接的动态库ldd
讲解
Linux
动态库:.so
静态库:.a
Linux中库真实的名字:去掉前后缀如:libc.so.6
去掉lib,去掉后缀,就剩下了c,所以意味着c标准库
windows:
动态库:.dll
静态库:.lib
为什么要程序和库结合?
a.让我们开发站在巨人的肩膀上
b.提高开发效率
链接时,两种链接方式
动态库,动态链接的优缺点
1不可以丢失
2.节省资源
静态链接和&静态链接的优缺点
1,一旦形成,和库无关
2.浪费资源
默认情况下,没有安装静态库
输入该指令安装c和c++的静态库
sudo yum install -y glibc-static libstdc++-static
验证
输入
gcc Test.c -o mytest
gcc -o mytest_static Test.c -static
创建两个文件(一个用动态库,一个用静态库)
分别对两个文件ldd,可以发现一个显示了库,一个不是动态可执行文件
静态链接的应用场景
不依赖库,可以让程序更好的跨平台