【Linux】03 GCC编译器的使用

本文详细介绍了GCC编译器的四个主要阶段(预处理、编译、汇编和链接),以及常用的编译选项,如生成目标文件、优化级别、库文件链接等。同时涵盖了动态库和静态库的制作与使用方法。
摘要由CSDN通过智能技术生成

一、编译过程

 在使用gcc编译程序时,编译过程可以简要划分为4个阶段:

        预处理、编译、汇编、链接

1.1 预处理(preprocessing)

这个阶段主要处理源文件中的#indef、#include和#define预处理命令;
这里主要是把一些include的头文件和一些宏定义,放到源文件中。

编译命令:gcc  -E  -o  hello.i  hello.c

 1.2 编译(compilation)

将经过预处理文件(test.i)之后的程序转换成特定汇编(test.s)代码

 编译命令:gcc  -S  -o  hello.s  hello.i

1.3 汇编(assembly)

汇编过程将上一步的汇编代码转换成机器码,这一步产生的文件叫做目标文件,是二进制格式

编译命令: gcc  -c  -o  hello.o  hello.s

1.4 链接(linking) 

链接过程使用链接器将该目标文件与其他目标文件、库文件、启动文件等链接起来生成可执行文件。附加的目标文件包括静态连接库和动态连接库。

编译命令:gcc  -o  hello  hello.o 

 二、 常用编译选项

2.1 -c

        预处理、编译和汇编源文件,但是不作链接,编译器根据源文件生成 OBJ 文件。缺省情况下, GCC 通过用`.o'替换源文件名的后缀`.c', `.i', `.s'等,产生 OBJ 文件名。可以使用-o 选项选择其他名字。 GCC 忽略-c 选项后面任何无法识别的输入文件

2.2 -S

         编译后即停止,不进行汇编。对于每个输入的非汇编语言文件,输出结果是汇编语言文件。缺省情况下, GCC 通过用`.s'替换源文件名后缀`.c', `.i'等等,产生汇编文件名。可以使用-o 选项选择其他名字。 GCC 忽略任何不需要汇编的输入文件

2.3 -E

        预处理后即停止,不进行编译。预处理后的代码送往标准输出 

2.4 -o file

        指定输出文件为 file。无论是预处理、编译、汇编还是链接,这个选项都可以使用。如果没有使用`-o'选项,默认的输出结果是:可执行文件为`a.out';修改输入文件的名称是`source.suffix',则它的 OBJ 文件是`source.o',汇编文件是 `source.s',而预处理后的 C 源代码送往标准输出。 

2.5 -v 

显示制作 GCC 工具自身时的配置命令;同时显示编译器驱动程序、预处理器、编译器的版本号

2.6 -Wall

打开了所有需要注意的警告信息,比如没有指定类型的声明、在声明之前就使用的函数、局部变量除了声明就没再使用等 

2.7 -g

以操作系统的本地格式(stabs, COFF, XCOFF,或 DWARF)产生调试信息, GDB 能够使用这些调试信息 

2.8 -O、-O1、-O2、-O3

优化:对于大函数,优化编译的过程将占用稍微多的时间和相当大的内存 

-O:不优化

-O1:优化一些

-O2:多优化一些

-O3:优化的更多

2.9 -llibrary

链接名为 library 的库文件。链接器在标准搜索目录中寻找这个库文件,库文件的真正名字是`liblibrary.a' 

2.10 -nostartfiles 

不链接系统标准启动文件,而标准库文件仍然正常使用 

2.11 -nostdlib

不链接系统标准启动文件和标准库文件,只把指定的文件传递给链接器 

2.12 -static 

在支持动态链接(dynamic linking)的系统上,阻止链接共享库 

2.13 -shared 

生成一个共享 OBJ 文件,它可以和其他 OBJ 文件链接产生可执行文件 

2.14 -Idir 

在头文件的搜索路径列表中添加 dir 目录 

2.15 -I i 的大写)

指定头文件路径(相对路径或绝对路径,建议相对路径) 

2.16 -L 

指定连接的动态库或者静态库路径(相对路径或绝对路径,建议相对路径) 

2.17 -fPIC

用于生成位置无关的代码(Position-Independent-Code),可以使得动态库可以被多个程序共享 

三、库的制作与使用

3.1 制作、使用动态库

1.将源文件进行汇编操作,需要使用参数 -c, 还需要添加额外参数 -fpic /-fPIC

gcc 源文件(*.c) -c -fPIC

2. 将得到的.o 文件打包成动态库,还是使用 gcc, 使用参数 -shared 指定生成动态库  

gcc -shared 与位置无关的目标文件(*.o) -o 动态库(libxxx.so) 

3.  编译APP

gcc -o test main.o -lsub -L /libsub.so/所在目录/

 4. 使用APP

  • 先把 libsub.so 放到 Ubuntu 的/lib 目录,然后就可以运行 test 程序
  • 如果不想把 libsub.so 放到/lib,也可以放在某个目录比如/a,然后执行 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/a

 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./

./test

3.2 制作、使用静态库

1.将源文件进行汇编操作,需要使用参数 -c, 还需要添加额外参数 -fpic /-fPIC

gcc 源文件(*.c) -c -fPIC

2.  将得到的.o 文件打包成动态库,使用 ar指令生成静态库

ar  crs  静态库(libxxx.so)   与位置无关的目标文件(*.o)

3.  编译APP

gcc -o test main.o -lsub -L /libsub.a/所在目录/

 4. 使用APP

./test

### 回答1: Linux 中的 GCC 编译器使用方法如下: 1. 安装 GCC 编译器: 使用终端输入 `sudo apt-get install gcc` 命令进行安装。 2. 编写源代码: 使用文本编辑器编写 C/C++ 源代码。 3. 编译源代码: 使用终端输入 `gcc -o 程序名 源代码名` 命令进行编译。 4. 运行程序: 使用终端输入 `./程序名` 命令运行程序。 例如: ``` $ gcc -o hello hello.c $ ./hello ``` 其中 -o 参数是指定生成的可执行文件的名称,如果不加-o参数默认生成 a.out 文件 有关 GCC 编译器的更多使用方法,请输入 `gcc --help` 命令查看。 ### 回答2: gcc是GNU Compiler Collection (GNU编译器系列)的缩写,它是一个自由软件的编译器,支持多种编程语言,包括C、C++、Objective-C、Fortran、Ada、以及Java。它是Linux系统中常用编译器之一。 在Linux系统中使用gcc编译器可以通过命令行完成。首先需要在终端中打开一个文本编辑器,创建并保存源代码文件,文件名以“.c”为扩展名。接着进入终端,使用cd命令进入到源代码文件所在的目录,然后使用gcc命令进行编译。 例如: gcc hello.c -o hello 其中,hello.c是源代码文件名,-o表示输出文件名,后面的hello则是输出文件的名称。 在编译过程中,还可以在命令后添加一些选项,以对编译参数进行设置。例如,使用-Wall选项可以开启编译器的所有警告提示,使用-g选项可以生成调试信息,方便调试程序。 例如: gcc -Wall -g hello.c -o hello 除了以上的基本命令之外,还可以通过man gcc命令查看手册,了解更多的编译命令行参数和选项的用法。当然,对于大型项目的编译,一些高级的IDEs也可以辅助完成编译工作。 ### 回答3: GCC(Gnu C Compiler)是Linux系统下的一个著名的编译器,它是GNU编译器套件(GNU Compiler Collection)的一部分,支持多种语言的编译,如C、C++、Objective-C、Fortran、Ada等。 GCC安装 通常,GCC已经预装在大多数Linux发行版中,如果没有安装,可以使用以下命令进行安装: - Ubuntu/Debian:sudo apt-get install gcc - Fedora/CentOS:sudo yum install gcc - Arch:sudo pacman -S gcc GCC编译 使用GCC编译源代码时,首先需要将源代码保存在一个文件中。以C语言为例,假设有一个main.c文件,可以使用以下命令进行编译: gcc main.c -o main 其中,-o选项指定编译后的可执行文件名为main。如果编译成功,将生成一个名为main的可执行文件。 GCC编译时还可以使用其他选项,如-Wall选项可以开启所有警告信息,-g选项可以为代码添加调试信息。 GCC链接库 在Linux系统中,经常需要使用外部库,例如数学库、字符串处理库、网络库等,GCC支持链接这些库以方便在程序中使用。以链接数学库为例: gcc main.c -o main -lm 其中,-lm指定链接数学库。 GCC优化选项 GCC提供了多种编译优化选项,可以使编译后的代码更快、更小。以下是一些常用的优化选项: - -O0:关闭所有优化。 - -O1:启用基本优化,但不会增加代码大小。 - -O2:启用更多优化,可能会增加代码大小。 - -Os:优化代码大小,启用尽可能多的优化选项使用GCC时,需要根据具体情况来选择适合的优化选项。 总的来说,GCCLinux系统中一个非常重要的编译器,学会使用GCC可以更好地编写和调试程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值