Liunx下C与C++的编译

一、Liunx下C与C++的编译

1、编译的流程概念:

	预处理--> 编译-->汇编-->链接

详细流程:
1、预处理阶段。
具体做的事儿如下:
(1)将所有的#define删除,并且展开所有的宏定义。说白了就是字符替换
(2)处理所有的条件编译指令,#ifdef #ifndef #endif等,就是带#的那些
(3)处理#include,将#include指向的文件插入到该行处
(4)删除所有注释
(5)添加行号和文件标示,这样的在调试和编译出错的时候才知道是是哪个文件的哪一行
(6)保留#pragma编译器指令,因为编译器需要使用它们。
2、编译阶段。
编译的过程实质上是把高级语言翻译成机器语言的过程,即对a.c做了这些事儿
(1)词法分析,
(2)语法分析
(3)语义分析
(4)优化后生成相应的汇编代码
3、汇编阶段。
汇编器(as) 将hello.s翻译成机器语言指令,把这些指令打包成为一种叫做可重定位目标程序的格式,并将结果保存在目标文件hello.o中。hello.o文件是一个二进制文件, 它的字节编码是机器语言指令而不是字符,如果我们在文本编辑器中打开hello.o文件,呈现的将是一堆乱码。
4、链接阶段。
将多个文件结合起来,打包成可执行文件

2、C与C++的编译实现过程

C语言的源程序文件  *.c  编译工具 gcc
C++语言的源程序文件 *.cpp 编译工具 g++

c++就把c语言的gcc改成g++即可
以下以C语言为编译例
1、预处理

1、预处理:预处理指令执行   宏 展开

		gcc -E test.c 
		gcc -E test.c > test.txt  (将编译的过程,发送到test.txt)
		gcc -E text.c -o A.txt  (-o可以将编译内容传到A.txt中,若没有A.txt则会创建)

代码

#include <stdio.h>
#define XX 33
int main()
{
	XX;
	return 0;
}

XX被直接替换
Liunx下C与C++的编译

gcc -E test.c > test.txt 过程传到A.txt中打开
Liunx下C与C++的编译
2、编译与编译成汇编

			仅编译:
			gcc -c *.c -o *.o   (  -o作用与上面一样)
			编译成汇编:
			gcc -S *.c -o *.s

仅编译
Liunx下C与C++的编译
编译成汇编

Liunx下C与C++的编译
3、链接:
多个目标程序 包括 库 链接成一个可执行程序文件

		多个链接:gcc 1.o 2.o 3.o -o *.exe  (可以多个链接)
		单个链接:gcc 1.o  (不加-0 指定文件,默认生成a.out文件)

例:多文件链接(不指定文件)
产生a.out可执行文件
Liunx下C与C++的编译

多文件链接(-o指定文件)
执行方式:./指定文件名
Liunx下C与C++的编译

3、makefile的使用

makefile 可以简化我们编译时繁琐的工作,以达到简单的作用。

makefile一般是以.sh结尾(其他也是可以的);
1、普通版!

#是注释  
#目标     依赖项
math.exe:main.o Add.o sub.o
	gcc main.o Add.o sub.o -o math.exe
main.o:main.c
	gcc -c main.c -o main.o
Add.o:Add.c
	gcc -c Add.c -o Add.o
sub.o:sub.c
	gcc -c sub.c -o sub.o
clean:
	rm -f *.o math.exe

Liunx下C与C++的编译
makefile clean 的使用
表示删除生成文件

Liunx下C与C++的编译

在开头空处只能使用Tab键,没有使用则会出现以下错误
解决方法:检查有没有空格把它改成tab,要么重新建。
只会这样
Liunx下C与C++的编译

Liunx下C与C++的编译
2、简化版

$@   目标
$<   代表依赖 并且   是一个个代表

Liunx下C与C++的编译

#注释
#目标       依赖
myMath.exe:main.o Add.o sub.o
    gcc *.o -o $@

#目标 %.o main.o add.o ...
#依赖 %.c main.c add.c ...
	
%.o:%.c
	gcc -c $< -o $@
clean:
	rm -f *.o myMath.exe

Liunx下C与C++的编译

上一篇:搭建Liunx测试环境详解


下一篇:liunx 运维 学习计划(自学)