【操作系统】GCC

简介

gcc 和 g++:

  • 只要是 gcc 支持编译的程序代码,都可以使用 gcc 命令完成编译,但如果使用 g++ 指令,则无论目标文件的后缀名是什么,该指令都一律按照编译 C++ 代码的方式编译该文件。
  • 如果想使用 gcc 指令来编译执行 C++ 程序,需要在使用 gcc 指令时,手动为其添加 -lstdc++ -shared-libgcc 选项,表示 gcc 在编译 C++ 程序时可以链接必要的 C++ 标准库。

qVzIln.png


一步完成

一些参数:

  • -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.sgcc -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:不生成任何警告信息。

参考

posted @ 2022-03-15 20:08  空白4869  阅读(185)  评论(0编辑  收藏  举报