Linux c编程|周末学习

166 阅读3分钟

这是我参与更文挑战的第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++编译的控制
  1. 预处理(Preprocessing)
  2. 编译(Compilation)
  3. 汇编(Assembly)
  4. 链接(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 [ 选项 ] <文件名>

  1. 无选项编译链接 用法:gcc test.c 作用:将test.c预处理、汇编、编译并链接形成可执行文件。这里未指定输出文件,默认输出为a.out。

  2. 选项 -o 用法:gcc test.c -o test 作用:将test.c预处理、汇编、编译并链接形成可执行文件test。-o选项用来指定输出文件的文件名。

  3. 选项 -E 用法:gcc -E test.c -o test.i 作用:将test.c预处理输出test.i文件。

  4. 选项 -S 用法:gcc -S test.i  作用:将预处理输出文件test.i汇编成test.s文件。

  5. 选项 -c 用法:gcc -c test.s 作用:将汇编输出文件test.s编译输出test.o文件。

  6. 无选项链接 用法:gcc test.o -o test 作用:将编译输出文件test.o链接成最终可执行文件test。

  7. 选项-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编译有两种方案:一步编译和分步编译

  1. 采用一步编译 : gcc hello.c say_hello.c -o hello

  2. 分步编译的方案 : 思路: 编译每一个.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