GCC的编译选项

Makefile 中的gcc的编译选项有很多,因此学习记录下。

这些选项在Makefile文件中常用CFLAGS(gcc 用在c语言的编译),CXXFLAGS(g++用在c++的编译)来表示。

程序编译的过程

gcc 与 g++ 分别是 gnu 的 c & c++ 编译器 gcc/g++ 在执行编译工作的时候,总共需要4步:

  • 1、预处理,生成 .i 的文件[预处理器cpp]
  • 2、将预处理后的文件转换成汇编语言, 生成文件 .s [编译器egcs]
  • 3、将汇编代码变为目标代码(机器代码)生成 .o 的obj文件[汇编器as]
  • 4、连接目标代码, 生成可执行程序 [链接器ld]

选项

选项 释义
-c 只激活预处理,编译,和汇编。只把程序做成obj文件,不是可执行文件(因为没有链接,有的程序中也没有main入口)
-S 只激活预处理和编译,就是只把文件编译成为汇编代码。生成.s的汇编代码
-E 只激活预处理,不生成文件,你需要把它重定向到一个输出文件里面 例子:gcc -E hello.c > pianoapan.txt
-o 指定输出,缺省的时候,gcc 编译出来的文件是a.out
-Wall 显示所有警告信息
-w 不生成任何警告信息。
-Wextra 打印出更多的警告信息,比开启 -Wall 打印的还多
-ansi 关闭gnu c中与ansi c不兼容的特性,激活ansi c的专有特性(包括禁止一些asm inline typeof关键字,以及UNIX,vax等预处理宏
-include file 包含某个代码,简单来说,就是便于某个文件需要另一个文件的时候,就可以用它设
定,功能就相当于在代码中使用#include
-Idir 添加dir目录为头文件搜索路径,如-I./ 在当前目录查找头文件
-I- 取消前一个参数的功能,所以一般在-Idir之后使用
-llib 指定编译的时候使用的库,gcc -lcurses hello.c 使用库curses进行编译
-std= 编译的标准,包括GNU99,c++11,c99,等等
-O2 编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高
-Ldir 链接的时候,搜索库的路径 -L./ 在当前目录搜说
-g 产生调试信息,可以使用gdb调试可执行文件
-ggdb 此选项将尽可能的生成gdb的可以使用的调试信息.
-static 禁止使用动态库,所以,编译出来的东西,一般都很大,也不需要什么
-share 此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库.
-shared 创建一个动态链接库(不指定的话输出的是obj文件)gcc -fPIC -shared func.c -o libfunc.s
-rdynamic 动态连接符号信息,用于动态连接功能。所有符号添加到动态符号表中(目的是能够通过使用 dlopen 来实现向后跟踪)
-pedantic 用于保证代码规范满足ISO C和ISO C++标准, 不允许使用任何扩展以及不满足ISO C和C++的代码, 遵守 -std 选项指定的标准
-pthread 支持多线程, 使用pthread库
-fPIC PIC 是 position-independent code的意思, 此选项去除独立位置代码, 适合于动态链接

ar -r libhello.a hello.o #这里的ar相当于tar的作用,将多个目标打包。 makefile中用于创建静态链接库(就是把多个目标文件打包成一个)

参考

https://blog.csdn.net/navyhu/article/details/46788559

https://blog.csdn.net/woshinia/article/details/11060797>

https://gcc.gnu.org/onlinedocs/