ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
[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/ ```