gcc命令
1.0、参考
1.1、gcc命令的作用

GNU C Compiler

1.2、gcc命令的使用格式
gcc [option]... SOURCE_FILE...

UNIXGNU/Linux平台上, 文件名中一般不使用后缀名,但是为了能够通过文件名就看出文件是什么用途的,一般有如下默认规则:

后缀名说明
.h头文件
.s | .S汇编语言源文件
.cC源文件
.cppC++源文件
.mObjective-C源文件
.iC源文件经过预处理后的文件
.iiC++源文件经过预处理后的文件
.o编译后的目标文件
.a编译后的静态库文件
.so编译后的动态库文件
1.4.1、--help

查看gcc命令的使用帮助。

1.4.2、--version

查看GCC的版本信息。

1.4.3、--verbose | -v

打印出详细的操作过程等日志信息。

该选项可以帮助我们定位问题。

示例:

gcc --verbose --version
1.4.4、-o OUTPUT_FILE

ooutput的缩写,意思是输出,实际上,就是通过此参数指定生成的文件的名称。

如果不指定该选项,输出文件的默认名称是a.out,所以,我们一般都会指定一个有意义的文件名。

示例:

gcc -o hello hello.c
1.4.5、-E

只进行预处理

需要配合-o选项生成文件,否在直接在终端中显示结果。

示例:

gcc -E hello.c
gcc -E -o hello.i hello.c
1.4.6、-S

只进行预处理编译成汇编文件

可以不使用-o参数,默认生成同名的.s文件。

示例:

gcc -S hello.c
gcc -S -o hello.s hello.c
1.4.7、-c

只进行预处理编译成汇编文件汇编成目标文件

可以不使用-o参数,默认生成同名的.o文件。

示例:

gcc -c hello.c
gcc -c -o hello.o hello.c
1.4.8、-Wall

给出所有的警告信息。

示例:

gcc -Wall -o hello hello.c
1.4.9、-g

生成调试信息,这样编译后才能通过gdb进行调试。

示例:

gcc -g -o hello hello.c
1.4.10、-O<N>

指定优化级别NN0 ~ 3的整数,N越大优化效果越好,但处理时间越长。

N=0的时候,表示不进行优化。

示例:

gcc -O1 -o hello hello.c
1.4.11、-std=STD

指定要使用哪个C标准。

示例:

gcc –std=c90 -o hello hello.c
1.4.12、-D<MACRO[=VALUE]>

定义宏,而不是将宏事先写在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
1.4.13、-U<MACRO>

取消定义的宏。

1.4.14、-d

示例:查看gcc所定义的所有预定义宏:

gcc -dM /dev/null

示例2:打印出全部的宏定义

gcc -E -dM - </dev/null
gcc -E -dM xx.c
1.4.15、-print-sysroot

打印出当前默认的sysroot目录。

对于GNU/Linux,此值一般是空。

对于macOS,此值一般是/Library/Developer/CommandLineTools/SDKs/MacOSX10.xx.sdk

对于交叉编译器,此值是不为空的其他值。

示例:

1.4.16、--sysroot=DIR 

设置sysroot的值。

当没有指定-isysroot的时候,预处理器链接器分别在sysroot指定的子目录下查找头文件库文件

当指定了-isysroot的时候,预处理器-isysroot指定的子目录中查找头文件链接器sysroot指定的子目录中查找库文件

1.4.16、-isysroot=DIR 

指定预处理器在指定的子目录中查找头文件

1.4.17、-static

链接器在链接的时候,以静态链接方式进行链接。这样产生的程序比较大,因为所有的库都放到程序中了。这样有好处,也有坏处。要根据自己的情况而定。

如果没有指定此参数,将以动态链接的方式进行链接。

1.4.18、-shared

创建动态库

此参数与-pie-PIE互斥。

示例:

gcc -shared xx.c -o libxx.so
gcc -shared xx.c -o libxx.dylib
1.4.19、-pie | -PIE

创建可执行文件

此参数与-shared互斥。

示例:

gcc -pie xx.c -o xx
gcc -pie xx.c -o xx
1.4.20、-pic | -fPIC

创建位置无关的代码

示例:

gcc -shared -pic xx.c -o libxx.so
gcc -shared -pic xx.c -o libxx.dylib
1.4.19、-I<INCLUDE_DIR>

Iinclude的意思。

此参数提供额外的头文件查找目录。

示例:

gcc -I=/usr/local/opt/ncurses/include -o xx xx.c
1.4.20、-l<libraryName>

llibrary的意思。

此参数告诉编译器,我们的程序需要libraryName的库。

示例:

gcc -lcurses -o xx xx.c

上面的-lcurses就表示链接的时候需要libcurses.so这个库文件。

1.4.21、-L<LINK_DIR>

Llink的意思。

此参数提供额外的库文件查找目录。

示例:

gcc -lcurses -L=/usr/local/opt/ncurses/lib -o xx xx.c

上面的/usr/local/opt/ncurses/lib不在标准的库文件搜索范围内,如果我们不通过-L添加 这个搜索目录,链接器就找不到libcurses.so这个库文件,编译的时候就会报错。

1.4.22、-include<FILE>

动态的包含某个文件。

示例:

gcc -include config.h -o xx xx.c
1.4.23、-pipe

使用管道代替零时文件。管道是一直在内存中,而零时文件就可能涉及到磁盘的读写过程,显然使用管道的速度是最快的。

示例:

gcc -pipe -o xx xx.c
1.4.25、-finput-charset=CHARSET 

设置源码文件的编码。默认是UTF-8

该功能是调用iconv实现的。

1.4.26、-Wl,option 

链接器传递参数。参数的namevalue之间用,隔开。

示例:

gcc -Wl,rpath,/usr/local/opt/xx,rpath,/usr/local/opt/yy,-Map,output.map -o xx xx.c