这是我参与更文挑战的第5天 ,活动详情查看更文挑战
本文已参与 周末学习计划,点击查看详情
c语言标准
- ANSI C
- POSIX(提高UNIX程序可移植性)
- SVID(POSIX的扩展超集)
- XPG(X/Open可移植性指南)
- GNU C(唯一能编译Linux内核的编译器)
gcc 简介
名称:
- GNU project C and C++ Compiler
- GNU Compiler Collection 管理与维护
- GNU项目 对C/C++编译的控制
- 预处理(Preprocessing)
- 编译(Compilation)
- 汇编(Assembly)
- 链接(Linking)
GCC文件扩展名规范
(1).c为后缀的文件,是C语言源代码文件。
(2).h为后缀的文件,是头文件。
(3).C,.cc、.cpp、.cp或.cxx为后缀的文件,是C++源代码文件。
(4).h为后缀的文件,是程序所包含的头文件。
(5).i为后缀的文件,是已经预处理过的C源代码文件。
(6).ii为后缀的文件,是已经预处理过的C++源代码文件。
(7).m为后缀的文件,是Objective-C源代码文件。
(8).o为后缀的文件,是编译后的目标文件。
(9).s为后缀的文件,是汇编语言源代码文件。
(10).S为后缀的文件,是经过预编译的汇编语言源代码文件。
gcc使用
基本使用格式
$ gcc [ 选项 ] <文件名>
-
无选项编译链接 用法:gcc test.c 作用:将test.c预处理、汇编、编译并链接形成可执行文件。这里未指定输出文件,默认输出为a.out。
-
选项 -o 用法:gcc test.c -o test 作用:将test.c预处理、汇编、编译并链接形成可执行文件test。-o选项用来指定输出文件的文件名。
-
选项 -E 用法:gcc -E test.c -o test.i 作用:将test.c预处理输出test.i文件。
-
选项 -S 用法:gcc -S test.i 作用:将预处理输出文件test.i汇编成test.s文件。
-
选项 -c 用法:gcc -c test.s 作用:将汇编输出文件test.s编译输出test.o文件。
-
无选项链接 用法:gcc test.o -o test 作用:将编译输出文件test.o链接成最终可执行文件test。
-
选项-O 用法:gcc -O1 test.c -o test
作用:使用编译优化级别1编译程序。级别为1~3,级别越大优化效果越好,但编译时间越长
生成预处理文件
$gcc –E hello.c –o hello.i
生成汇编文件
gcc –S hello.c –o hello.s
生成对应的目标文件
gcc -c hello.c -o hello.o
目标代码并不能在CPU上运行,但它离二进制可执行文件已经很近了,再输入以下编译指令即可生成二进制可执行文件。
[root@localhost~]# gcc hello.o -o hello
对于多文件组成的项目,采用GCC编译有两种方案:一步编译和分步编译
-
采用一步编译 : gcc hello.c say_hello.c -o hello
-
分步编译的方案 : 思路: 编译每一个.c文件,得到.o的目标文件; 将每一个.o的目标文件链接成一个可执行的文件;
- gcc -c say_hello.c -o say_hello.o
- gcc -c hello.c -o hello.o
- gcc hello.o say_hello.o -o hello
文件hello.c引用的头文件say_hello.h不在当前目录中,也不在GCC默认的头文件搜索路径/usr/include中,这时我们应该使用-I选项指定搜索头文件的特殊目录,具体编译指令如下:
gcc hello.c functions/say_hello.c -o hello –I functions
make
- 适用场合: 多个文件组成的软件项目
- 基本格式:
目标:欲生成的目标文件
依赖项:生成目标需要的文件
- 原理: 判断依赖项是否为最新,否则,生成新的目标
- make工具的使用格式: make [命令选项] 通常使用make就可以了,make会寻找makefile作为编译指导文件;
makefile文件中还可以定义一些宏,宏的作用类似于C语言中的define命令,利用它们来代表某些多处使用而又可能发生变化的内容,可以节省重复修改的工作,还可以避免遗漏
1 CC=gcc
2 CFLAGS=-Wall-c #-Wall:编译后显示所有警告
3 OBJS= hello.o say_hello.o
4 hello:${OBJS}
5 ${CC} ${OBJS} -o hello
6 say_hello.o:say_hello.c say_hello.h
7 ${CC} ${CFLAGS} say_hello.c -o say_hello.o
8 hello.o:hello.c say_hello.h
9 ${CC} ${CFLAGS} hello.c -o hello.o