【操作系统】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
:不生成任何警告信息。