gcc笔记.pdf
文本预览下载声明
GCC笔记
The History of GCC
1984年,Richard Stallman发起了自由软件运动,GNU (Gnus Not Unix)项目应运而生,3年后,最
初版的GCC横空出世,成为第⼀款可 植、可优化、支持A NSI C的开源C编译器。
GCC最初的全名是GNU C Com iler,之后,随着GCC支持的语言越来越多,它的名称变成
了GNU Com iler Collection。
这里介绍的gcc是GCC的前端,C编译器.
警告信息
-Wall : 显示所有常用的编译警告信息。
-W : 显示更多的常用编译警告,如:变量未使用、⼀些逻辑错误。
-Wconversion : 警告隐式类型转换。
-Wshadow : 警告影子变量 (在代码块中再次声明已声明的变量)
-Wcast-qual :警告指针修改了变量的修饰符。如:指针修改const变量。
-Wwrite-strings : 警告修改const字符串。
-Wtraditional : 警告A NSI编译器与传统C编译器有不同的解释。
-Werror : 即使只有警告信息,也不编译。 (gcc默认:若只有警告信息,则进行编译,若有错误
信息,则不编译)
C语言标准
你可以在gcc的命令行中通过指定选项来选择相应的C语言标准: 从传统c到最新的GNU扩展C. 默认
情况下, gcc使用最新的GNU C扩展.
-ansi : 关闭GNU扩展中与A NSI C相抵触的部分。
- edantic : 关闭所有的GNU扩展。
-std=c89 : 遵循C89标准
-std=c99 : 遵循C99标准
-std=traditional : 使用原始C
注意:后4个选项可以与-ansi结合使用,也可以单独使用。
可在gcc 中使用大量GNU C扩展.
生成特定格式的文件
以hello.c为例子,可以设置选项生成hello.i, hello.s, hello.o以及最终的hello文件:
hello.c : 最初的源代码文件;
hello.i : 经过编译预处理的源代码;
hello.s : 汇编处理后的汇编代码;
hello.o : 编译后的目标文件,即含有最终编译出的机器码,但它里面所引用的其他文件中函数的
内存位置尚未定义。
hello / a.out : 最终的可执行文件
(还有.a(静态库文件), .so(动态库文件), .s(汇编源文件)留待以后讨论)
如果你不通过-o指定生成可执行文件名,那么会默认生成a.out. 不指定生成文件名肯能覆盖你上次
生成的a.out.
e.g.
$ gcc hello.c
在不给gcc传递任何参数的情况下, gcc执行默认的操作: 将源文件编译为目标文件-- 将目标文件连
接为可执行文件(名为a.out) -- 删除目标文件.
-c生成.o文件时,默认生成与源代码的主干同名的.o文件。比如对应hello.c生成hello.o. 但也可在生
成目标文件时指定目标文件名(注意同时要给出.o后缀): $ gcc -c -o demo.o demo.c
$ gcc -Wall -c hello.c : 生成hello.o
$ gcc -Wall -c -save-tem s hello.c : 生成hello.i, hello.s, hello.o
注意-Wall 选项的使用场合:仅在涉及到编译 (即会生成.o文件时,用-Wall)
多文件编译、连接
如果原文件分布于多个文件中:file1.c, file2,c
$ gcc -Wall file1.c file2.c -o name
若对其中⼀个文件作了修改,则可只重新编译该文件,再连接所有文件:
$ gcc -Wall -c file2.c
$ gcc file1.c file2.o -c name
注意:若编译器在命令行中从左向右顺序读取.o文件,则它们的出现顺序有限制:含有某函数定
义的文件必须出现在含有调用该函数的文件之后。好在GCC无此限制。
编译预处理
以上述的hello.c为例, 要对它进行编译预备处理, 有两种方法: 在gcc 中指定-E选项, 或直接调
用c .gcc的编译预处理命令程序为c ,比较新版本的gcc已经
显示全部