【操作系统】GCC
简介
gcc 和 g++:
- 只要是 gcc 支持编译的程序代码,都可以使用 gcc 命令完成编译,但如果使用 g++ 指令,则无论目标文件的后缀名是什么,该指令都一律按照编译 C++ 代码的方式编译该文件。
- 如果想使用 gcc 指令来编译执行 C++ 程序,需要在使用 gcc 指令时,手动为其添加
-lstdc++ -shared-libgcc选项,表示 gcc 在编译 C++ 程序时可以链接必要的 C++ 标准库。
一步完成
一些参数:
-o手动指定最终生成的可执行文件的文件名:gcc demo.c -o demo。gcc [-E|-S|-c] [输入文件] [-o 输出文件]。- 输入文件可有多个。
-x设定文件所使用的语言使后缀名无效:gcc -xc++ demo.c。-Idir在你是用#include "file"的时候, gcc/g++ 会先在当前目录查找你所制定的头文件,如果没有找到, 他回到默认的头文件目录找,如果使用-I制定了目录,他会先在你所制定的目录查找,然后再按常规的顺序去找。-std=手动指令编程语言所遵循的标准:-std=c++11。
例—— C:
$ gcc demo.c
$ ls -a
. .. .DS_Store a.out demo.c
$ ./a.out
Hello World
例—— C++:
$ g++ demo.c
# 或
$ gcc -xc++ demo.cpp -lstdc++ -shared-libgcc
多步完成
预处理
gcc -E demo.c -o demo.i。
- 选项
-E。 - 后缀
.i。
默认情况下 gcc -E 指令只会将预处理操作的结果输出到屏幕上,并不会自动保存到某个文件。因此该指令往往会和 -o 选项连用,将结果导入到指令的文件中。
其它参数:
-C:阻止 gcc 删除源文件和头文件中的注释。-D name[=definition]:在处理源文件之前,先定义宏name。搭配源代码中的#ifdef name命令使用,可以实现条件式编译。-U:如果在命令行或 gcc 默认设置中定义过宏name,则取消name的定义。
编译
gcc -S demo.c -o demo.s 或 gcc -S demo.i -o demo.s。
- 选项
-S。 - 后缀
.s,编译操作会默认创建一个文件名相同,后缀为.s的文件。
gcc -S 指令操作的文件并非必须是经过预处理后得到的 .i 文件,-S 选项的功能是令 gcc 编译器将指定文件处理至编译阶段结束。
汇编
gcc -c demo.s -o demo.o。
- 选项
-c。 - 后缀
.o,汇编操作会默认创建一个文件名相同,后缀为.o的文件。
和 gcc -S 类似,gcc -c 选项并非只能用于加工 .s 文件。事实上,-c 选项只是令 gcc 编译器将指定文件加工至汇编阶段,但不执行链接操作。
链接
gcc demo.o -o demo.exe。
其它
一次性处理多个文件:
- 进入该项目目录,用
*.c表示所有的源文件:gcc *.c -o main.exe。
头文件与库文件:
- 头文件只存储变量、函数或者类等这些功能模块的声明部分。
- 库文件负责存储各模块具体的实现部分。
- 所有的库文件都提供有相应的头文件作为调用它的接口。库文件是无法直接使用的,只能通过头文件间接调用。
头文件:
-include filename:相当于在代码中使用#include <filename>。-iquote dir、-Ipath、-isystem dir、-idirafter dir- 编译时指定头文件目录,使用标准库时不需要指定目录。
- 搜索顺序(对于用
#include ""引号形式引入的头文件):(也不知道对不对,咕咕咕~)- 当前程序文件所在的目录。
-iquote。-I。-isystem。-idirafter
链接库:
-Ldir:搜索库的路径。-llibrary:编译的时候使用的库。
其它:
-M:生成文件关联的信息,包含目标文件所依赖的所有源代码。-Wall:生成所有警告信息。-w:不生成任何警告信息。


浙公网安备 33010602011771号