GCC的编译选项
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
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 BraveY!





