目录
(2)、为什么#ifndef、#define、#endif 可以防止头文件被重复包含?
2、查看 可执行文件所链接/依赖的库:ldd + 可执行文件名
一、快速认识一下gcc/g++
可以用来编译链接.c文件,使之生成可执行文件。
其中 -o 选项是用来重命名为“my.exe”;
注意:
(1)、C语言既可以使用gcc也可以使用g++;
(2)、C++只能使用g++;
(3)、gcc和g++的使用方法是完全相同的,所以以讲解gcc为主;
二、程序的翻译过程
会经历以下四步:C语言为例
1、预处理:-E选项
分为一以下四步:
(1)、 头文件展开:
所谓头文件展开,本质是预处理的时候,将头文件的内容拷贝到源文件。
(2) 、去注释:即把注释给去掉
(3)、宏替换:在编译之前将对应的宏标识符替换为对应的宏定义内容。
(4)、条件编译:
我们可以通过给编译器传递不同的宏值,来进行对代码的动态裁剪。
条件编译应用:
各种软件的专业版和社区版就是使用同一套源代码,只是社区版是通过条件编译将某些功能给去掉了,所以专业版功能会更多。如下:
若源代码中有某些ifndef指令的话,就可以通过条件编译打印出不同的内容。
(1)、通过指令查看预处理结果:-E选项
-E 选项:表示从现在开始进行程序翻译的过程,当预处理做完就停下来。
(1)、使用 -o 选项将生成的数据放到 .i 文件中(若不使用-o选项,就会将结果打印到终端上)
(2)、.i 文件通常称为预处理文件,里面是预处理四个步骤后所产生的结果。
注意:预处理后的代码还是C语言:
(2)、为什么#ifndef、#define、#endif 可以防止头文件被重复包含?
这也是条件编译的应用场景之一:
我们知道在预处理阶段,头文件是会被展开的,第一次条件检查检测该宏有没有被定义,如果没有定义就会进行定义,如果第二次又包含了该头文件,就会再展开,再条件检测,发现该宏已经被定义过了,就不会在使用该头文件里面的内容了。
2、编译:-S选项
C语言——>汇编:将C语言翻译成汇编语言。
(1)、通过指令查看编译结果:-S选项
通过 -S 选项对预处理文件(.i 文件)进行处理,会生成 .s 文件,.s 文件称为汇编语言源文件,即使不用 -o 选项指定名字,也会自动在同级目录生成同名.s文件,.s文件里面内容就是由C语言转换而来的汇编语言:
3、汇编:-c选项
汇编语言——>二进制语言(可重定位目标二进制文件,但不能执行)
将汇编语言翻译成二进制语言。
(1)、通过指令查看汇编结果:-c 选项
(1)、通过 -c 选项就就可以执行汇编过程,会生成 .o 文件(即使不使用 -o 选项,也会生成同名.o文件)。
(2)、 .o 文件称为可重定位目标二进制文件,里面放的全是二进制数据:因为linux终端是是用于显示文本内容,所以查看二进制数据时会显示乱码。
注意 .o 文件是不能被执行的( ./ ):
4、链接:-o选项
1、-o选项
(1)、通过-o选项进行链接操作,生成就是可执行文件。
(2)、注意 -o 选项一定要指定生成的文件名:
(3)、生成的文件就可以执行了:
2、查看 可执行文件所链接/依赖的库:ldd + 可执行文件名
(1)、首先我们要知道库分为动态库和静态库,后缀名分别如下:
(2)、ldd指令:
3.为什么linux可以直接运行C语言?
平台要支持开发,就必须要提前字系统中安装各种语言的标准头文件+库文件。
如下是linux中安装的C语言头文件:
这就是为什么linux可以直接运行C语言。