编译代码的步骤:
预处理器:源代码经过预处理器处理后变成了修改后的源代码,主要是处理#符号开头的特殊行;
编译器: 编译修改后的源代码,将翻译后的机器语言指令,也就是目标代码,存储在目标文件中;
目标文件:不是完整的程序,因为它不包含一些必要的运行时库,所以无法执行;
运行时库:执行一些常规操作或者某些困难任务预先编写好的代码库;具有广泛性,程序难免要用到它的一部分;
链接器:将目标文件与必须的运行时库结合,会创建可执行文件;
可执行文件:包含机器语言指令或可执行代码,已经可以在计算机上运行;
许多IDE实际上集成了上述功能, 只需要单击一个按钮,或从菜单中选择一个菜单项即可完成预处理,编译,链接,甚至执行程序;
命令行模式下编译C语言程序,这样能够了解生成一个可执行程序的详细步骤,以及编译命令的各种设置选项,为以后的 Linux C/C++ 开发打好坚实的基础。
GCC 仅仅是一个编译器,没有界面,必须在命令行模式下使用。通过gcc命令就可以将源文件编译成可执行文件。
Linux 不以文件后缀来区分可执行文件,Linux 下的可执行文件后缀理论上可以是任意的,
这里的.out只是用来表明它是 GCC 的输出文件。不管源文件的名字是什么,GCC 生成的可执行文件的默认名字始终是a.out。
如果不想使用默认的文件名,那么可以通过-o选项来自定义文件名
gcc main.c -o main.out
因为 Linux 下可执行文件的后缀仅仅是一种形式上的,所以可执行文件也可以不带后缀
gcc main.c -o main
后缀说明:
.o //编译的目标文件,对应于windows的.obj文件
.so //动态链接库(共享库),是shared object,用于动态连接的,对应于windows的.dll
.a //静态库,对应于windows的.lib
.c .cpp .h //源文件,头文件
.out //只是一种形式上的后缀
.sh
.conf
1、编译
gcc -c main.c
一个源文件会生成一个目标文件,多个源文件会生成多个目标文件,源文件数目和目标文件数目是一样的。
通常情况下,默认的目标文件名字和源文件名字是一样的。
如果希望自定义目标文件的名字,那么可以使用-o选项
gcc -c main.c -o a.o
2、链接
gcc main.o //gcc命令后面紧跟目标文件的名字,就可以将目标文件链接成为可执行文件;
//而且会自动识别到底是源文件还是目标文件;
//如果是源文件,要经过编译,链接两个步骤才能生成可执行文件;
//如果是目标文件,只需要链接就可以了;
源文件的后缀名,只是为了表明该文件中保存的是某种语言的代码;
工程/项目 ->为当前程序配备的专用文件夹;
程序分类:
不带界面的 ->控制台程序;
带界面,用鼠标点击 ->GUI程序;
不单独出现的,只作为其他程序的一个组成部分->静态库,动态库;
源代码经过编译(Compile),链接(Link)两个过程才能变成可执行文件;
编译器一次只能编译一个源文件,如果包含了多个源文件,也需要多次编译,每次编译的结果是产生一个中间文件;
当程序的所有中间文件以及系统库(或者理解为系统中的一些组件)组合在一起时,才能形成最终的可执行文件。
这个组合的过程叫做链接;完成链接功能的软件叫做链接器;
即便编译后的程序可能只有一个中间文件,不再需要和其他中间文件结合了,但是还需要和一些系统库组合。这个过程也是链接;