gcc编译器在编译一个C语言程序时要通过如下4步:bash
流程图以下:ide
gcc编译选项 | 选项的意义 |
-c | 编译、汇编指定的源文件,可是不进行连接 |
-S | 编译指定的源文件,可是不进行汇编 |
-E | 预处理指定的源文件,不进行编译 |
-o [file1] [file2] | 将文件file2编译成可执行文件file1 |
-I directory | 指定include包含文件的搜索目录 |
-g | 生成调试信息,该程序能够被调试器调试 |
注意:gc编译选项会区分大小写。spa
-c选项表示编译、汇编指定的源文件,可是不进行连接。使用-c选项能够将每个源文件编译成对应目标文件。若是不设置该选项,gcc生成的目标文件没有.o文件,以下例子:调试
使用gcc选项表示只编译源文件,而不进行连接,所以,对于连接中出错的错误是没法发现的。code
-S选项将C语言的源文件编译为汇编语言,可是并不汇编该语言。ci
例如:编译器
#include <stdio.h> int f(int a, int b) { return a + b; } int main(void) { int c; c = f(1, 2); return 0; }
执行命令:it
gcc -S test.c
查看生成的汇编代码:io
.file "test3.c" .text .globl f .type f, @function f: .LFB0: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 movl %edi, -4(%rbp) movl %esi, -8(%rbp) movl -4(%rbp), %edx movl -8(%rbp), %eax addl %edx, %eax popq %rbp .cfi_def_cfa 7, 8 ret .cfi_endproc .LFE0: .size f, .-f .globl main .type main, @function main: .LFB1: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 subq $16, %rsp movl $2, %esi movl $1, %edi call f movl %eax, -4(%rbp) movl $0, %eax leave .cfi_def_cfa 7, 8 ret .cfi_endproc .LFE1: .size main, .-main .ident "GCC: (Debian 5.3.1-19) 5.3.1 20160509" .section .note.GNU-stack,"",@progbits
-E选项将C语言源文件进行预处理,可是并不编译该程序。对于通常的预处理问题,能够只用这个选项进行查看,例如,宏的展开问题,文件的包含问题等。编译
-o选项的格式:
-o [file1] file2
-o选项将输入的文件编译为一个名为file2的二进制可执行程序。
例如:
gcc test.c -o test
gcc接受的输入文件不只能够是C语言的源文件(.c文件),同时也能够是已经编译好的目标文件(.o文件)。
用于指定包含的头文件的目录,这一点对于大型的代码组织来讲颇有用的。
-g 选项可生成能被gdb调试器所使用的调试信息。只有使用了该选项后生成的可执行文件,才带有程序中引用的符号表。这时gdb调试程序才能对该可执行程序进行调试。