gcc 编译原理

gcc 编译原理

以前写C/C++程序都是在windows下面用VS完成的,程序的编译过程IDE都替你完成了,虽然对初学者来说很容易上手,但是它也掩盖了程序编译链接的原理,如果不了解这些的话,那么只会停留在入门阶段,不会对程序有更深的理解。而且更重要的是,很多优秀的开源项目都是用make或cmake编译,因此,了解Linux平台下的编译工具gcc是很有必要的。本文简要介绍gcc编译的过程的使用方法。

1 一步生成可执行程序
如有一个文件:test.c, 执行如下命令:
gcc test.c -o test
可一步到位生成可执行程序 test. 但实际上包含了四个步骤:
在这里插入图片描述
当然,以上步骤也可以分步完成。

2 预处理
预处理就是将要包含(include)的文件插入原文件中、将宏定义展开、根据条件编译命令选择要使用的代码,最后将这些代码输出到一个“.i”文件中等待进一步处理
gcc -E test.c -o test.i

3 编译
c代码 --> 汇编代码
gcc -S test.i -o test.s

4 汇编
汇编代码 --> 机器码
gcc -c test.s -o test.o

5 链接
链接就是将汇编生成的OBJ文件、系统库的OBJ文件、库文件链接起来,最终生成可以在特定平台运行的可执行程序
gcc test.o -o test

参考:
https://blog.csdn.net/czg13548930186/article/details/78331692
https://www.cnblogs.com/mingcaoyouxin/p/4282522.html

6 gcc 编译常见的编译选项

-I: 将目录dir添加到要搜索的目录列表中以查找头文件。在标准系统包含目录之前,搜索由‘-i’命名的目录
-Wall: 选项意思是编译后显示所有警告。
-fPIC: 生成与位置无关的代码,适用于动态库编译
-fopenmp: 启用openmp的#pragma指令
-Dxxx: 预定义宏xxx
-Ofast: 无视严格的标准
-O0: 减少编译时间,使调试产生预期的结果。这是默认的
-g: 以操作系统的本机格式生成调试信息(TAPS、COFF、XCOFF或DUF 2) gdb可以使用此调试信息
-pthread: 添加对多线程的支持。此选项为预处理器和链接器设置标志
`pkg-config --cflags opencv` : 调用pkg-config工具获取本机上opencv的include目录选项
`pkg-config --libs opencv` : 调用pkg-config工具获取本机上opencv的动态库链接选项。

pkg-config原理参考: https://www.cnblogs.com/chris-cp/p/3580002.html

猜你喜欢

转载自blog.csdn.net/healingwounds/article/details/84404138