Linux下编译运行C语言程序的步骤及GCC常用编译选项

GCC(GNU Compiler Collection,GNU编译器套件),是由 GNU 开发的编程语言编译器。它是以GPL许可证所发行的自由软件,也是 GNU计划的关键部分。

GCC原本作为GNU操作系统的官方编译器,现已被大多数类Unix操作系统(如Linux、BSD、Mac OS X等)采纳为标准的编译器。Linux下使用最广泛的C语言编译器就是GCC,大多数的Linux发行版本都默认安装,不管是开发人员还是初学者,一般都将GCC作为Linux下首选的编译工具。

一、编译运行C语言程序

编写C语言源程序,以经典的Hello World为例。代码如下:

[ycxie@fedora Workspace]$ cat test.c
#include <stdio.h>

int main(void)
{
    printf("Hello World\n");
    return 0;
}

1.预处理
命令行输入:gcc -E test.c -o test.i
在当前目录下会多出一个预处理结果文件 test.i,打开 test.i 可以看到,在test.c的基础上把stdio.h的内容插进去了。

[ycxie@fedora Workspace]$ cat test.c | wc -l
8
[ycxie@fedora Workspace]$ cat test.i | wc -l
870

test.c只有8行,插入stdio.h后的test.i变成了870行,长度增加了不少嘛。

2.编译为汇编代码
命令行输入:gcc -S test.i -o test.s
其中-S参数是在编译完成后退出,-o为指定文件名。

[ycxie@fedora Workspace]$ gcc -S test.i -o test.s
[ycxie@fedora Workspace]$ cat test.s
        .file   "test.c"
        .section        .rodata
.LC0:
        .string "Hello World"
        .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
.LFE0:
        .size   main, .-main
        .ident  "GCC: (GNU) 7.1.1 20170622 (Red Hat 7.1.1-3)"
        .section        .note.GNU-stack,"",@progbits

3.汇编为目标文件
命令行输入:gcc -c test.s -o test.o
.o就是目标文件。目标文件与可执行文件类似,都是机器能够识别的可执行代码,但是由于还没有链接,结构会稍有不同。

4.链接并生成可执行文件
命令行输入:gcc test.o -o test
可以看到在当前目录下多出一个文件 test,这就是可执行文件。
如果有多个源文件,可以这样来编译:
gcc -c test1.c -o test1.o
gcc -c test2.c -o test2.o
gcc -c test2.c -o test3.o
gcc test1.o test2.o test3.o -o test

5.运行
命令行输入:./test

[ycxie@fedora Workspace]$ gcc -c test.s -o test.o
[ycxie@fedora Workspace]$ gcc test.o -o test
[ycxie@fedora Workspace]$ ./test
Hello World

二、GCC常用编译选项

–help
显示GCC帮助说明。

–version
显示GCC版本号和版权信息。

-o outfile
输出到指定的文件。

-v
打印较多信息,显示编译器调用的程序。

-E
仅作预处理,不进行编译、汇编和链接。

-S
仅编译到汇编语言,不进行汇编和链接。

-c
编译、汇编到目标代码,不进行链接。

-static
在支持动态链接的系统上,阻止连接共享库。该选项在其它系统上无效。

-std
-std=c99 指明使用标准ISO C99作为标准来编译程序。
-std=gnu99 使用ISO C99再加上GNU的一些扩展。

对于程序的检错,我们可以用-pedantic、-Wall、-Werror选项:
-pedantic选项能够帮助程序员发现一些不符合ANSI/ISO C标准的代码(并不是全部);
-Wall可以让gcc显示警告信息;
-Werror可以让gcc在编译中遇到错误时停止继续。
这3个选项都是非常有用的。
对Linux开发人员来讲,GCC给出的警告信息是很有价值的,它们不仅可以帮助程序员写出更加健壮的程序,而且还是跟踪和调试程序的有力工具。建议在用GCC编译源代码时始终带上-Wall选项,养成良好的习惯。

Leave a Reply

Your email address will not be published. Required fields are marked *