目录
一、一次性编译
在Linux上编译.c文件并非直接生成.out文件(Windows上为.exe),中间还经历了预处理、编译、汇编、链接四个过程,好在gcc提供了生成中间文件的指令。
1、新建、编辑源文件
- 首先,建个名为“测试”的文件夹,cd进入文件夹
- 接下来用touch在文件夹内创建一个空白的 hello.c 源文件。(hello.c 其实就是一个纯文本文件,并没有任何特殊格式)
- 再用gedit编辑源文件
$ cd 测试 #进入"测试"目录,这是源文件所在的目录
$ touch hello.c #使用touch命令创建一个名为hello.c的空文件
$ gedit hello.c #使用gedit命令编辑hello.c
终端操作如下:
gedit命令后将会出现一个面板,我们输入程序:
保存文件后就完成了源代码的编辑工作。
2、生成可执行程序
最简单的生成可执行文件的写法为:
$ cd 测试 #进入源文件所在的目录
$ gcc hello.c #在gcc命令后面紧跟源文件名
这时打开“测试”目录,会看到多了一个名为 a.out 的文件,这就是最终生成的可执行文件,这样就一次性完成了编译和链接的全部过程:
注意:Linux不以文件后缀来区分可执行文件,Linux下的可执行文件后缀理论上可以是任意的,这里的.out只是用来表明它是 GCC 的输出文件。不管源文件的名字是什么,GCC 生成的可执行文件的默认名字始终是a.out
如果不想使用默认的文件名,可以通过-o来自定义文件名:
$ gcc hello.c -o hello.out
这样生成的可执行程序的名字就是hello.out:
因为Linux下可执行文件的后缀仅仅是一种形式上的,所以可执行文件也可以不带后缀,例如:
$ gcc hello.c -o hello
这样生成的可执行程序的名字就是hello:
通过-o也可以将可执行文件输出到其他目录,并不一定非得在当前目录下:
$ gcc hello.c -o ./ccc/hello.out (./表示当前目录,如果不写默认也是当前目录)
或
$ gcc hello.c -o ccc/hello.out
上面的指令表示:将可执行文件输出到当前目录下的子目录ccc中,并命名为hello.out(ccc目录必须存在)
3、运行可执行程序
$ ./a.out
./表示当前目录,整条命令的意思是运行当前目录下的 a.out 程序
注意:如果不写./,Linux会到系统路径下查找 a.out,而系统路径下不存在这个程序,所以会运行失败
运行结果:
4、完整演示
$ cd 测试 #进入源文件所在目录(cd)
$ touch hello.c #新建源文件(touch)
$ gedit hello.c #编辑源文件(gedit)
$ gcc hello.c #生成可执行程序(紧跟)
$ ./a.out #运行可执行程序
HELLO GCC
二、分两步编译
1、编译(Compile)
-c将源文件(.c)编译成目标文件(.o)
gcc -c hello.c
就将 hello.c 编译为 hello.o。打开"测试"目录,就会看到它:
如果希望自定义目标文件的名字,那么可以使用-o选项,例如:
gcc -c hello.c -o HELLO.o
2、链接(Link)
在gcc命令后紧跟目标文件的名字,就可以将目标文件(.o)链接成可执行文件(.out):
gcc hello.o
就将hello.o 链接为 a.out,打开目录就会看到 a.out。
使用-o选项仍然能自定义可执行文件的名字:
gcc hello.o -o HELLO.out
这样生成的可执行文件的名字就是 HELLO.out
3、完整演示
$ cd 测试 #进入源文件所在目录(cd)
$ gcc -c hello.c #编译源文件为目标文件(-c)
$ gcc hello.o #链接目标文件为可执行文件(紧跟)
$ ./a.out #运行可执行程序
HELLO GCC
三、分四步编译
1、预处理(.i)
这个阶段输入.c源文件,主要处理文件中的带“#”的语句,将要包含(include)的文件插入原文件中、将宏定义展开、根据条件编译命令选择要使用的代码,最后将这些代码输出到一个“.i”文件中等待进一步处理:
gcc -E hello.c -o hello.i
2、编译(.s)
这个阶段输入第一阶段生成的 .i 文件,输出成汇编语言 .s 文件:
gcc -S hello.i -o hello.s
3、汇编(.o)
这个阶段输入第二阶段的汇编文件 .s 文件,然后编译成机器语言 .o 文件,在Linux系统上一般表现为ELF目标文件(OBJ文件):
gcc -c hello.s -o hello.o
合三为一
以上三个阶段可以合为一:gcc –c hello.c –o hello.o(即上面的两步编译)
4、链接(.out)
这个阶段输入第三步输出的机器文件 .o ,将汇编生成的OBJ文件、系统库的OBJ文件、库文件链接起来,最终生成可以在特定平台运行的可执行程序:
gcc hello.o –o hello.out