GNU C Compiler
gcc [option]... SOURCE_FILE...
在UNIX和GNU/Linux平台上, 文件名中一般不使用后缀名,但是为了能够通过文件名就看出文件是什么用途的,一般有如下默认规则:
后缀名 | 说明 |
.h | 头文件 |
.s | .S | 汇编语言源文件 |
.c | C源文件 |
.cpp | C++源文件 |
.m | Objective-C源文件 |
.i | C源文件经过预处理后的文件 |
.ii | C++源文件经过预处理后的文件 |
.o | 编译后的目标文件 |
.a | 编译后的静态库文件 |
.so | 编译后的动态库文件 |
查看gcc
命令的使用帮助。
查看GCC的版本信息。
打印出详细的操作过程等日志信息。
该选项可以帮助我们定位问题。
示例:
gcc --verbose --version
o
是output
的缩写,意思是输出,实际上,就是通过此参数指定生成的文件的名称。
如果不指定该选项,输出文件的默认名称是a.out
,所以,我们一般都会指定一个有意义的文件名。
示例:
gcc -o hello hello.c
只进行预处理
。
需要配合-o
选项生成文件,否在直接在终端中显示结果。
示例:
gcc -E hello.c
gcc -E -o hello.i hello.c
只进行预处理
、编译成汇编文件
。
可以不使用-o
参数,默认生成同名的.s
文件。
示例:
gcc -S hello.c
gcc -S -o hello.s hello.c
只进行预处理
、编译成汇编文件
、汇编成目标文件
。
可以不使用-o
参数,默认生成同名的.o
文件。
示例:
gcc -c hello.c
gcc -c -o hello.o hello.c
给出所有的警告信息。
示例:
gcc -Wall -o hello hello.c
生成调试信息,这样编译后才能通过gdb进行调试。
示例:
gcc -g -o hello hello.c
指定优化级别N
,N
为0 ~ 3
的整数,N
越大优化效果越好,但处理时间越长。
N=0
的时候,表示不进行优化。
示例:
gcc -O1 -o hello hello.c
指定要使用哪个C标准。
示例:
gcc –std=c90 -o hello hello.c
定义宏,而不是将宏事先写在C源文件中。
假设有如下的源代码:
#include<stdio.h>
int main() {
#ifdef DEBUG
printf("debug\n");
#else
printf("release\n");
#endif
return 0;
}
在调试、测试的时候,使用如下的命令进行编译:
gcc -DDEBUG -o hello hello.c
在发布的时候,使用如下的命令进行编译:
gcc -o hello hello.c
取消定义的宏。
示例:查看gcc
所定义的所有预定义宏:
gcc -dM /dev/null
示例2:打印出全部的宏定义
gcc -E -dM - </dev/null
gcc -E -dM xx.c
打印出当前默认的sysroot
目录。
对于GNU/Linux,此值一般是空。
对于macOS,此值一般是/Library/Developer/CommandLineTools/SDKs/MacOSX10.xx.sdk
。
对于交叉编译器
,此值是不为空的其他值。
示例:
设置sysroot
的值。
当没有指定-isysroot
的时候,预处理器
和链接器
分别在sysroot
指定的子目录下查找头文件
和库文件
。
当指定了-isysroot
的时候,预处理器
在-isysroot
指定的子目录中查找头文件
,链接器
在sysroot
指定的子目录中查找库文件
。
指定预处理器
在指定的子目录中查找头文件
。
链接器
在链接的时候,以静态链接
方式进行链接。这样产生的程序比较大,因为所有的库都放到程序中了。这样有好处,也有坏处。要根据自己的情况而定。
如果没有指定此参数,将以动态链接
的方式进行链接。
创建动态库
。
此参数与-pie
和-PIE
互斥。
示例:
gcc -shared xx.c -o libxx.so
gcc -shared xx.c -o libxx.dylib
创建可执行文件
。
此参数与-shared
互斥。
示例:
gcc -pie xx.c -o xx
gcc -pie xx.c -o xx
创建位置无关的代码
示例:
gcc -shared -pic xx.c -o libxx.so
gcc -shared -pic xx.c -o libxx.dylib
I
是include
的意思。
此参数提供额外的头文件
查找目录。
示例:
gcc -I=/usr/local/opt/ncurses/include -o xx xx.c
l
是library
的意思。
此参数告诉编译器,我们的程序需要libraryName
的库。
示例:
gcc -lcurses -o xx xx.c
上面的-lcurses
就表示链接的时候需要libcurses.so
这个库文件。
L
是link
的意思。
此参数提供额外的库文件
查找目录。
示例:
gcc -lcurses -L=/usr/local/opt/ncurses/lib -o xx xx.c
上面的/usr/local/opt/ncurses/lib
不在标准的库文件搜索范围内,如果我们不通过-L
添加 这个搜索目录,链接器
就找不到libcurses.so
这个库文件,编译的时候就会报错。
动态的包含某个文件。
示例:
gcc -include config.h -o xx xx.c
使用管道代替零时文件。管道是一直在内存中,而零时文件就可能涉及到磁盘的读写过程,显然使用管道的速度是最快的。
示例:
gcc -pipe -o xx xx.c
设置源码文件的编码。默认是UTF-8
。
该功能是调用iconv实现的。
给链接器
传递参数。参数的name
和value
之间用,
隔开。
示例:
gcc -Wl,rpath,/usr/local/opt/xx,rpath,/usr/local/opt/yy,-Map,output.map -o xx xx.c