由于部分功能的需要,在某活动送的移动硬盘上安装上Ubuntu玩玩,本想装Redhat工作站什么的耍耍,奈何功力太浅,又无心研究,先拿这一款操作系统练练手。对GCC是什么就不赘述了。
对于一个程序,可以一步到位地编译:
gcc test.c -o test
但仅仅局限在这样便捷的操作上,太对不起自己的求知欲了。
实质上,上述命令是简化了四个步骤:预编译(Preprocessing)、编译(Compilation)、汇编(Assembly)、连接(Linking)。
这里给出一个小程序,并提供给四个步骤生成的代码。(这里插一句,vi是神一样的编辑器这种说法真的真的只是个人臆断,用的舒服不舒服完全是看自己的。切莫人云亦云。)
#include <stdio.h>
int main(){
printf("Hello,Linux.\n");
return 0;
}
仅是个简单的“Hello,World”
我们对其预处理,命令如下:
gcc -E test.c -o test.i
那么test.i里的内容是如下的:
# 1 "test.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "test.c"
# 1 "/usr/include/stdio.h" 1 3 4
# 27 "/usr/include/stdio.h" 3 4
# 1 "/usr/include/features.h" 1 3 4
# 374 "/usr/include/features.h" 3 4
# 1 "/usr/include/x86_64-linux-gnu/sys/cdefs.h" 1 3 4
# 385 "/usr/include/x86_64-linux-gnu/sys/cdefs.h" 3 4
# 1 "/usr/include/x86_64-linux-gnu/bits/wordsize.h" 1 3 4
# 386 "/usr/include/x86_64-linux-gnu/sys/cdefs.h" 2 3 4
# 375 "/usr/include/features.h" 2 3 4
# 398 "/usr/include/features.h" 3 4
# 1 "/usr/include/x86_64-linux-gnu/gnu/stubs.h" 1 3 4
# 10 "/usr/include/x86_64-linux-gnu/gnu/stubs.h" 3 4
# 1 "/usr/include/x86_64-linux-gnu/gnu/stubs-64.h" 1 3 4
# 11 "/usr/include/x86_64-linux-gnu/gnu/stubs.h" 2 3 4
# 399 "/usr/include/features.h" 2 3 4
# 28 "/usr/include/stdio.h" 2 3 4
预处理的结果是将stdio.h文件中的内容插入到test.c中
标准的预处理规定,C/C++要求支持包括条件编译(#if #ifdef #ifndef #else #elif #endif)、宏定义(#define)、包含(#include)、行控制(#line)、错误指令(#error)、杂注(#pragma)、空(#)。预处理指令一般用来使源代码在不同的编译环境下方便的修改或编译。
而后,对预编译后的结果文件编译为汇编代码,命令格式如下:
gcc -S test.i -o test.s
那么test.s里边是编译后的汇编代码:
.file "test.c"
.section .rodata
.LC0:
.string "Hello,Linux."
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movl $.LC0, %edi
call puts
movl $0, %eax
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
而后,将编译后的汇编代码编译成为目标文件:
gcc -c test.s -o test.o
目标文件就不太好看了,里边是编译后的机器码。
最后就是将各个目标文件链接起来生成可执行文件了,连接负责将程序的目标文件与所需的所有附加的目标文件连接起来,最终生成可执行文件。附加的目标文件包括静态连接库和动态连接库。
gcc test.o -o test