首页 > 代码库 > gcc使用教程

gcc使用教程

gcc是一个编译器,下面以例子来学习如何使用这个编译器。

/*File:hello.c*/
#include <stdio.h>
int
main(int argc, char **argv)
{
	printf("Hello world.\n");
	return 0;
}

编辑好hello.c文件后,用gcc编译器编译它:gcc hello.c

执行完该命令后,生成可执行文件a.out,执行该文件,即可在终端显示:

Hello world.

这样看来gcc工具是如此简单,其实并非如此,要想真正掌握gcc的使用并非易事,因为它有非常多的选项,下面给出详细介绍。

-o选项

可以指定输出文件名,如gcc -o hello hello.c命令,就可以指定输出为hello而不是a.out。


-E选项

预处理后即停止,不进行编译。预处理后的代码送往标出输出。GCC忽略任何不需要预处理的输入文件。


-S选项

编译后即停止,不进行汇编。对每个输入的非汇编语言文件,输出结果是汇编语言文件。默认情况下,GCC通过用.s替换源文件名后缀.c或.i等,产生汇编文件名。GCC忽略任何不需要汇编的输入文件。


-c选项

可以只编译而不链接源文件,加上-c选项后执行预处理、编译和汇编源文件,但不作链接,编译器根据源文件生成obj文件。默认情况下,gcc通过用.o文件替换源文件名的后缀.c或.s等。gcc -c hello.c命令默认情况下输出hello.o文件,除非用-o选项指定输出文件名。


-Wall选项

警告选项它基本打开了所有需要注意的警告信息,比如没有指定类型的声明、在声明之前使用的函数、局部变量除了声明就没再使用等。比如修改上面的hello.c程序,增加一个int i;语句,加上-Wall警告选项后,会出现如下警告信息:

hello.c: In function ‘main’:hello.c:7: warning: unused variable ‘i‘


-g选项

调试选项,加上它之后,在以后用gdb调试程序时,会特别方便


-O或-O1优化选项

对于大函数,优化编译的过程将占用较长时间和相当大的内存。优化得到的程序比没优化的要小。不适用-O选项的目的是减少编译的开销,使编译结果能够调试、语句是独立的。-O2是多优化一些,最常使用。这个选项既增加了编译时间,也提高了生成代码的运行效果。-O0是不优化。


-llibrary连接器选项

连接名为library的库文件。连接器在标准搜索目录中寻找这个库文件,库文件的真名字是"liblibrary.a"。搜索目录除了一些系统标准目录外,还包括用户以“-L”选项指定的路径。一般说来用这个方法找到的文件是库文件——即由obj文件组成的归档文件。连接器处理归档文件的方法是:扫描归档文件,寻找某些成员,这些成员的符号目前已被引用,不过还没被定义。但是,如果连接器找到普通的OBJ文件,而不是库文件,就把这个OBJ文件按平常方式连接进来。指定“-l”选项和指定文件名的唯一区别是:“-l”选项用“lib”和“.a”把library包裹起来,而且搜索一些目录。


-nostartfile选项

指不连接系统标准启动文件,而标准库文件仍然正常使用。对于一般应用程序,系统标准启动文件是必须的,但对于Bootloader、内核等,却可用这个选项。


-nostdlib选项

指不连接系统标准启动文件和标准库文件,只把指定的文件传递给连接器。常用于编译内核、Bootloader等程序。


-static选项

在支持动态连接的系统上阻止连接共享库,在不支持动态连接的系统上,该选项无效。

gcc  -o hello hello.c

gcc -static -o hello_static hello.c

ls查看生成的hello文件和hello_static文件差别如下:

-rwxr-xr-x 1 book book  82982014-06-11 16:59 hello
-rwxr-xr-x 1 book book 5791432014-06-11 16:59 hello_static

-shared选项

生成一个共享OBJ文件,它可以和其他OBJ文件连接产生可执行文件。

可以将多个文件制作为一个库文件,比如:gcc -shared -o text.a text.o text1.o text2.o text3.o


-Idir目录选项

在头文件的搜索路径列表中添加dir目录。

-I-选项

任何在“-I-”前面用“-I”选项指定的搜索路径只适用于“#include "file"”这种情况,不能用来搜索“#include <file>”包含的头文件。如果用“-I”选项指定的搜索路径位于“-I-”选项后面,就可以在这些路径中搜索所有“#include”指令。“-I”选项能够阻止当前目录成为搜索“#include "file"”的第一选择。

-Ldir选项

在“-I”选项的搜索路径列表中添加dir目录。

-include file

单次包含头文件file,就像file头文件在源文件开始处一样。


ld用于将多个目标文件、库文件连接成可执行文件,它的大多数选项跟上面的一样。其中有一个非常重要的“-T”选项,可以直接使用它来指定代码段、数据段、bss段的起始地址,也可以用来指定一个连接脚本,在链接脚本中进行跟复杂的地址设置。

方法如下:

-Ttext startaddr

-Tdata startaddr

-Tbss  startaddr   

"startaddr"表示代码段、数据段和bss段的起始地址。

-Tuboot.lds表示使用链接脚本uboot.lds。