目录

1. Linux下的编译器:gcc和g++

1.1概念区分

1.2 编译

1.2.1翻译的过程——C:重点放在编译选项上

1.2.2一般程序的构建过程——.o

1.2.3条件编译

1.2.4 编译器和对应语言的关系——自举

1.3 链接

1.3.1初步理解

1.3.2 关于链接和指令查看:ldd

1.3.3 动态库和静态库

1.3.4如何理解动静态库和链接

1.3.4.0 通过一个小故事来理解

1.3.4.1动态库故事

1.3.4.2 静态库故事

1.3.5   gcc默认是动态链接

1.3.6 两个地方

1.3.6.1 我把c动态库删了怎么办

1.3.6.2 gcc默认使用动态库和动态链接


1. Linux下的编译器:gcc和g++

1.1概念区分

1.2 编译

把源文件翻译成可执行二进制文件——编译的过程。

1.2.1翻译的过程——C:重点放在编译选项上

格式 gcc [ 选项 ] 要编译的⽂件 [ 选项 ] [ ⽬标⽂件 ]
预处理(进⾏宏替换)
预处理功能主要包括宏定义,⽂件包含,条件编译,去注释等。
预处理指令是以#号开头的代码⾏。
实例: gcc –E hello.c –o hello.i
选项“-E”,该选项的作⽤是让 gcc 在预处理结束后停⽌编译过程。
选项“-o”是指⽬标⽂件,“.i”⽂件为已经过预处理的C原始程序。
编译(⽣成汇编)
在这个阶段中,gcc ⾸先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的⼯作, 在检查⽆误后,gcc 把代码翻译成汇编语⾔。
⽤⼾可以使⽤“-S”选项来进⾏查看,该选项只进⾏编译⽽不进⾏汇编,⽣成汇编代码。
实例: gcc –S hello.i –o hello.s
汇编(⽣成机器可识别代码)
汇编阶段是把编译阶段⽣成的“.s”⽂件转成⽬标⽂件
读者在此可使⽤选项“-c”就可看到汇编代码已转化为“.o”的⼆进制⽬标代码了
实例: gcc –c hello.s –o hello.o
连接(⽣成可执⾏⽂件或库⽂件)
在成功编译之后,就进⼊了链接阶段。
实例: gcc hello.o –o hello

1.2.2一般程序的构建过程——.o

gcc -c *.c
gcc *.o -o exe
./exe

形成同名目标文件再编译,增加编译效率——

所有的.c文件编译成.o文件再链接形成可执行文件。

1.2.3条件编译

1.2.4 编译器和对应语言的关系——自举

1.3 链接

1.3.1初步理解

1.3.2 关于链接和指令查看:ldd

ldd:查看文件依赖哪个库。

1.3.3 动态库和静态库

静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大(大不少,前面展示过了),但在运行时也就不再需要库文件了。其后缀名一般为“.a”

动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由
运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为“so”,如前面所述的libc.so.6就是动态库。gcc在编译时默认使用动态库。完成了链接之后,gcc就可以生成可执行文件。

gcc hello.o -o hello

gcc默认生成的二进制程序,是动态链接的,这点可以通过file命令验证。

1.3.4如何理解动静态库和链接

1.3.4.0 通过一个小故事来理解

我们先了解一下故事的人物设定,主人公小明是光明初中的尖子生,以优异的成绩考入到第一中学,小明喜欢上网,但是第一中学是一所“军事化管理”的顶级学府,强制学生住校,进入高中后,小明的成绩一直名列前茅,稳居年级第一的宝座,但是小明一直想上网,好在高中前的暑假,小明爸爸让小明向刚刚从第一中学毕业的邻居cailo同学请教高中的各种事宜,小明趁机把想要上网的想法告诉了cailo学姐,cailo邪魅一笑,告诉小明:从学校东门出发,先向左走100米,再向右走100米,有一家[柚子电竞馆],我高中时只要上网就会到那里去。最近,小明又有些蠢蠢欲动了……
 

1.3.4.1动态库故事

1.3.4.2 静态库故事

小明有这么一位神通广大的老父亲,小明把情况一五一十交代了,小明说:“我第一次月考比全校第二高100分,现在只高了50多分,就是因为不能上网才退步的!”,父亲一个电话打给了校长:“校长,我们家小明想要上网,你们不要阻止”。校长说:“好吧好吧,谁叫小明是年级第一呢?”于是父亲准备去买电脑,刚好 [柚子电竞馆] 的老板拘留完刚刚放出来,小明父亲找到老板,买走了一台电脑,小明又能上网了!小明把电脑带到了宿舍,其他同学看到后心痒难耐,也跑去找爸爸,爸爸们把电话又打到了校长办公室,“校长,我们家孩子想上网,你们老师就不要管啦!”昂热摇摇头:“你们都这么说了,那还说啥,让孩子们上网不就行了吗?”爸爸们找到 [柚子电竞馆] 的老板,又从他那里买走了电脑,老板因祸得福,走在校门口迎面撞见了帽子叔叔👮‍♀️,老板忍不住轻哼~😒“看我干嘛?我已经不开网吧了哦!”帽子叔叔气得牙痒痒,拿他也没办法。

1.3.5   gcc默认是动态链接

这里我搞错了,但我soft.cpp里面写的是c代码,所以可以编通过。

1.3.6 两个地方

1.3.6.1 我把c动态库删了怎么办

一般而言,系统中大部分指令(C/C++编写的二进制指令)就无法运行了!

1.3.6.2 gcc默认使用动态库和动态链接

Linux系统中,默认只安装了动态库,怎么办?我们手动安装一下静态库就可以了——

各位自己找ai询问一下怎么安装吧。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐