最全的Linux教程,Linux从入门到精通
======================
-
linux从入门到精通(第2版)
-
Linux系统移植
-
Linux驱动开发入门与实战
-
LINUX 系统移植 第2版
-
Linux开源网络全栈详解 从DPDK到OpenFlow
第一份《Linux从入门到精通》466页
====================
内容简介
====
本书是获得了很多读者好评的Linux经典畅销书**《Linux从入门到精通》的第2版**。本书第1版出版后曾经多次印刷,并被51CTO读书频道评为“最受读者喜爱的原创IT技术图书奖”。本书第﹖版以最新的Ubuntu 12.04为版本,循序渐进地向读者介绍了Linux 的基础应用、系统管理、网络应用、娱乐和办公、程序开发、服务器配置、系统安全等。本书附带1张光盘,内容为本书配套多媒体教学视频。另外,本书还为读者提供了大量的Linux学习资料和Ubuntu安装镜像文件,供读者免费下载。
本书适合广大Linux初中级用户、开源软件爱好者和大专院校的学生阅读,同时也非常适合准备从事Linux平台开发的各类人员。
需要《Linux入门到精通》、《linux系统移植》、《Linux驱动开发入门实战》、《Linux开源网络全栈》电子书籍及教程的工程师朋友们劳烦您转发+评论
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
二、背景知识
-
- 预处理(进行宏替换)
-
- 编译(生成汇编)
-
- 汇编(生成机器可识别代码)
-
- 连接(生成可执行文件或库文件)
具体可以参考我写的这几篇文章,里面很详细的讲解了预处理、编译、汇编、链接相关的重点知识
【C/C++内功心法】剖析编译链接的过程,探究源文件是如何一步步变成可执行程序,提升C/C++内功
三、gcc如何完成
格式: gcc [选项] [要编译的文件] [选项] [目标文件]
1.预处理(进行宏替换)
- 预处理功能主要包括宏定义,文件包含,条件编译,去注释等。(具体可以看我上面说的那几篇文章)
- 预处理指令是以#号开头的代码行。
- 实例: gcc -E hello.c -o hello.i
- 选项 “-E” ,该选项的作用是让 gcc 在预处理结束后停止编译过程。(也就是说:从现在开始进行程序的翻译,如果预处理完成,就停下来!)
- 选项 “-o” 是指目标文件,“.i” 文件为已经过预处理的C原始程序。
举例:
#include<stdio.h>
#define M 100
int main()
{
printf("M: %d\n", M);
printf("hello world1\n");
// 预处理后这些注释将会被删除
// 预处理后这些注释将会被删除
// 预处理后这些注释将会被删除
printf("hello world2\n");
// 条件编译
#ifdef DEBUG
printf("hello debug\n");
#else
printf("hello release\n");
#endif
return 0;
}
预处理指令:
命令:gcc -E test.c -o test.i
也可以这样写:
只要-o后面跟的是想要生成的目标文件的文件名即可。
命令:gcc -E -o test.i test.c
执行完上面的预处理指令后,当前路径下就会多一个test.i文件,我们进入并查看test.i文件的内容。
预处理完后头文件被展开,所以文件多了800多行代码,并且注释被删除,宏被替换,条件编译已完成。
2.编译(生成汇编)
- 在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc 把代码翻译成汇编语言。
- 用户可以使用“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。(也就是说:从现在开始进行程序的翻译,如果编译完成,就停下来!)
- 实例: gcc -S hello.i -o hello.s
- 提示:这里要编译的文件可以写hello.i也可以写hello.c,区别在于:写hello.i的话,编译器就直接从预处理好的test.i文件开始编译;写hello.c的话,编译器会从头开始先预处理一遍hello.c这个源文件,然后编译完成后停下来。
举例:(还是以上面那个代码举例)
编译指令:
命令:gcc -S test.i -o test.s
执行完上面的编译指令后,当前路径下就会多一个test.s文件,我们进入并查看test.s文件的内容。
这时,所有的代码就已经变成了汇编指令。
3.汇编(生成机器可识别代码)
- 汇编阶段是把编译阶段生成的“.s”文件转成目标文件。
- 读者在此可使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了。
- 实例: gcc -c hello.s -o hello.o
举例:
汇编指令:
命令:gcc -c test.s -o test.o
执行完上面的汇编指令后,当前路径下就会多一个test.o文件(叫做可重定向目标文件),我们进入并查看test.o文件的内容。
这时,所有的代码就已经变成了二进制目标代码。
4.连接(生成可执行文件或库文件)
- 在成功编译之后,就进入了链接阶段。
- 并且连接不需要带任何选项
- 实例: gcc hello.o -o hello
举例:
汇编指令:
命令:gcc test.o -o test
执行完上面的链接指令后,当前路径下就会多一个test文件(可执行程序),这时我们就可以运行此文件了。
提示:如果想直接生成可执行文件的话,就不用带“-E”、“-S”、“-c”这些选项,其他的不变。
举例:
命令:gcc hello.c -o hello.exe
5.记忆选项的小技巧
- 预处理、编译、汇编对应的gcc选项分别是 “-E”、“-S”、“-c”,我们把这几个字母连起来也就是键盘的最左上角那个键【Esc】,我们只需要记住E和S是大写的,c是小写的即可。
- 而预处理、编译、汇编后形成的文件后缀连起来就是【iso】(iso也就是镜像文件的后缀)。
- 所以最后我们只需要记住选项【Esc】对应文件后缀【iso】即可。
6.一个重要的概念:函数库
- 我们的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实现“printf”函数的呢?
- 最后的答案是:系统把这些函数实现都被做到名为 libc.so.6 的库文件中去了,在没有特别指定时,gcc 会到系统默认的搜索路径“/usr/lib64”下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现函数“printf”了,而这也就是链接的作用。
如何查看当前可执行文件所依赖的库?
命令:ldd test
如下就是test这个可执行文件所依赖的库:
当然,我们也能查看当前所有的所有头文件:
命令:ls /usr/include
总结:
- 这里的:/lib64/libc-2.17.so 就提供了C语言的方法(函数)实现。
- /usr/include/stdio.h 就提供了C语言的方法列表(方法的声明)。
- 最终我们的可执行文件里面将会包含头文件stdio.h,并且将libc-2.17.so链接。
7.再谈链接过程与函数库。
一般链接的过程,是有两种方式的:
- 动态链接——需要动态库
- 静态链接——需要静态库
- Linux下的文件名后缀:.so(动态库),.a(静态库)
- Windows下的文件名后缀:.dll(动态库),.lib(静态库)
所以函数库也就分为静态库和动态库两种:
- 静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为“.a”
- 动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为“.so”,如前面所述的 libc.so.6 就是动态库。gcc 在编译时默认使用动态库。完成了链接之后,gcc 就可以生成可执行文件。
如下所示:
最全的Linux教程,Linux从入门到精通
======================
-
linux从入门到精通(第2版)
-
Linux系统移植
-
Linux驱动开发入门与实战
-
LINUX 系统移植 第2版
-
Linux开源网络全栈详解 从DPDK到OpenFlow
第一份《Linux从入门到精通》466页
====================
内容简介
====
本书是获得了很多读者好评的Linux经典畅销书**《Linux从入门到精通》的第2版**。本书第1版出版后曾经多次印刷,并被51CTO读书频道评为“最受读者喜爱的原创IT技术图书奖”。本书第﹖版以最新的Ubuntu 12.04为版本,循序渐进地向读者介绍了Linux 的基础应用、系统管理、网络应用、娱乐和办公、程序开发、服务器配置、系统安全等。本书附带1张光盘,内容为本书配套多媒体教学视频。另外,本书还为读者提供了大量的Linux学习资料和Ubuntu安装镜像文件,供读者免费下载。
本书适合广大Linux初中级用户、开源软件爱好者和大专院校的学生阅读,同时也非常适合准备从事Linux平台开发的各类人员。
需要《Linux入门到精通》、《linux系统移植》、《Linux驱动开发入门实战》、《Linux开源网络全栈》电子书籍及教程的工程师朋友们劳烦您转发+评论
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!