gcc
最后更新于:2022-04-02 03:52:00
[TOC]
> [查考](https://tkstorm.com/linux-programming/introduction.html)
## gcc 命令说明
```
-w 不生成任何警告信息
-Wall 生成所有警告信息
-c 只激活预处理,编译,和汇编,也就是他只把程序做成obj文件
例子 gcc -c hello.c ,将生成 .o 的 obj 文件
-S 只激活预处理和编译,就是指把文件编译成为汇编代码
例子 gcc -S hello.c ,将生成 .s 的可查看汇编的文件
-o 制定目标名称, 默认的时候, gcc 编译出来的文件是 a.out
例子 gcc -o hello hello.c
-M | -MM 生成文件关联的信息。包含目标文件所依赖的所有源代码
例子 gcc -M hello.c
-l 制定编译的时候使用的库
例子 gcc -lmyfunc hello.c
-L 制定编译的时候,搜索库的路径
例子 gcc -o test test.c -l myfunc -L .
-O01234 编译器的优化选项的 4 个级别,-O0 表示没有优化, -O1 为默认值,-O3 优化级别最高
-static 此选项将禁止使用动态库,编译出来都很大,也不需要什么动态连接库,就可以运行
-share 此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库
例子 gcc -fPIC -shared myfunc.c -o libmyfunc.so
-print-prog-name=cc1 -v 获知系统的 include 默认搜索路径
-print-search-dirs lib库默认搜索路径
```
## 头文件
* linux版本头文件:/usr/include/sys、/usr/include/linux
* 其他的/usr/include/X11、/usr/include/c++等
在调用c语言编译器时,使用`-I`来包含保存在标准的子目录或者非标准位置中的头文件。
```
gcc -I/usr/openwin/include fred.c
```
## 库文件
- 标准库函数通常存储在`/lib`、`/usr/lib`两个目录中
- 若有用到标准C语言运行库外的其他库,则需要使用`-l`方式指明
**库名**
以lib开头,随后指明是什么库(c:C语言库,m:数学库),后缀类型(`.a`:传统静态函数库,`.so`:共享函数库)
**编译**
可以用完整库名,或者`-l`加库简写(如`-lm`,代表编译过程中,需要从标准库目录中搜索名为libm.a的数学函数库)
`-l`标志的另一个好处,有共享库会优先使用共享库
```
gcc -o fred fred.c -lm
// 等效
gcc -o fred fred.c /usr/lib/libm.a
```
可以基于大写的-L,使编译器增加库的搜索目录
`gcc -o x11fred -L/usr/openwin/lib x11fred.c -lX11`,表示用`/usr/openwin/lib`目录中的libX11库来编译和链接程序x11fred.
## 预定义include的<>与""的区别
对于 `#include <...>` ,GCC 编译器会在默认 include 搜索路径中寻找。
对于 `#include "..."` ,GCC 编译器会在**当前路径**搜索 .h 文件。当然你也可以使用 -I 选项提供额外的搜索路径,比如 `-I /home/test/`
## 示例
### -print-prog-name=cc1 -v
```
> gcc -print-prog-name=cc1 -v
使用内建 specs。
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/lto-wrapper
/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/cc1
```
### gcc -print-search-dirs
```
> gcc -print-search-dirs
安装:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/
程序:=/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/:/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/:/usr/libexec/gcc/x86_64-redhat-linux/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/:/usr/lib/gcc/x86_64-redhat-linux/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../x86_64-redhat-linux/bin/x86_64-redhat-linux/4.8.5/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../x86_64-redhat-linux/bin/
库:=/usr/lib/gcc/x86_64-redhat-linux/4.8.5/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../x86_64-redhat-linux/lib/x86_64-redhat-linux/4.8.5/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../x86_64-redhat-linux/lib/../lib64/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../x86_64-redhat-linux/4.8.5/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/:/lib/x86_64-redhat-linux/4.8.5/:/lib/../lib64/:/usr/lib/x86_64-redhat-linux/4.8.5/:/usr/lib/../lib64/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../x86_64-redhat-linux/lib/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../:/lib/:/usr/lib/
```
';