【Linux】Linux编译器-gcc/g++使用

简介: 【Linux】Linux编译器-gcc/g++使用

当你的希望一个个落空,你也要坚定,要沉着!                                          —— 朗费罗

debacd671389c6b8df4d24e54fe635bf_72df34436a3746fabaca4cf7cc18c699.gif

前言

gcc/g++是一个编译器

那么gcc将如何实现呢?

格式   gcc [选项] 要编译的文件 [选项] [目标文件]

📘程序的翻译

程序编译分为四个过程:


1.预处理   2.编译     3.汇编       4.链接


预处理(头文件展开,条件编译,宏替换,去注释等)

编译(c语言汇编语言)

汇编(汇编->可重定位目标二进制文件,不可以被执行的,bin.obj)只把我们自己的代码进行翻译形成二进制目标文件

链接(将我们这自己形成的.obj文件和库文件某种合并,形成可执行程序)

🖍编译过程

预处理功能主要包括宏定义,文件包含,条件编译,去注释等。

预处理指令是以#号开头的代码行。

实例: gcc –E hello.c –o hello.i

选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。

选项“-o”是指目标文件,“.i”文件为已经过预处理的C原始程序。  

下面我来详细演示具体实现:

这是myfile.c文件中写的C语言程序

 

如何直接生成可执行程序呢?

gcc 文件名 可以将文件直接编译成一个a.out的可执行程序

当需要生成一个需要由指定文件名的可执行程序如何操作呢?

-o为目标文件

具体过程:

8501c0028d4865a960bd457efb71a8cd_30a13de677bc42859959ea8c1eb478e3.png

“.i”文件为已经过预处理的C原始程序


“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。


“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。


汇编阶段是把编译阶段生成的“.s”文件转成目标文件“.o”的二进制目标代码


在成功编译之后,就进入了链接阶段。

0dc6bb19913aab77ea76860308b36629_d7c9cd83f1124a2789f43f82d09d1398.png


44dabfba4a250cfe7271151ef5158b69_12bbd2994dd24896a0efc9fb4a92b173.png


📘动态库和静态库

1.库分为静态库(专门让编译器,对用户的程序进行静态链接的)和动态库(专门让编译器, 对用户的程序进行动态链接的)

2.静态库和静态链接:链接的时候,如果是静态链接,找到静态库,拷贝静态库中的我所需要的代码到我自己的可执行程序中

3.动态库和动态链接:链接的时候,如果是动态链接,找到动态库,拷贝动态库中的我所需要的代码的地址到我自己的可执行程序中相关的位

4.静态链接成功:我们的程序,不依赖任何库,自己就可以独立运行

5.动态链接成功:我们的程序,还是依赖动态库,一旦动态库缺失,我们的程序便无法运行!

6.静态库,因为自身拷贝的问题,比较浪费空间

7.动态库:因为可以做到被大家共享方法,所以真正的实现永远都是在库中,程序内部只有地址,比较节省空间

8.静态库vs动态库: Linux默认使用的是动态链接和动态库!


1.静态库: libXXXXXX.a

2.动态库: libXXXXXX.so

静态链接

综上总结:

  • -E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面
  • -S  编译到汇编语言不进行汇编和链接
  • -c  编译到目标代码
  • -o 文件输出到 文件
  • -static 此选项对生成的文件采用静态链接

Linux项目自动化构建工具-make/Makefile

makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编 译,极大的提高了软件开发的效率。

make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命 令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一 种在工程方面的编译方法。

make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。

依赖关系

上面的文件 myfile ,它依赖 myfile.o

myfile.o , 它依赖 myfile.s

myfile.s , 它依赖 myfile.i

myfile.i , 它依赖 myfile.c

依赖方法

上面文件的指令就是依赖方法

clean:换行后删除语句

但是一般我们这种clean的目标文件,我们将它设置为伪目标

用 .PHONY 修饰,伪目标的特性是,总是被执行的。

使用make不成功的常见原因及解决方法

当你文件已经是最新版本时,系统就认为你不需要在进行make操作就会报这样的报错

我们可以通过时间来判断文件是否是最新的!

stat 文件名 可以查看时间

touch可以更改为最新时间

相关文章
|
23天前
|
小程序 Linux 开发工具
【Linux】Linux 开发工具(vim、gcc/g++、make/Makefile)+【小程序:进度条】-- 详解
【Linux】Linux 开发工具(vim、gcc/g++、make/Makefile)+【小程序:进度条】-- 详解
|
8天前
|
自然语言处理 Ubuntu 编译器
使用 `byacc`(Berkeley Yacc)在Linux中构建编译器
本文介绍了如何在Linux中使用`byacc`构建编译器。首先,通过包管理器安装`byacc`,如在Debian/Ubuntu上使用`apt-get install byacc`,在Red Hat/CentOS/Fedora上使用`yum`或`dnf`。接着,定义编程语言的语法(如示例中的简单计算器`calc.y`),然后运行`byacc -d calc.y`生成C代码。最后,编译生成的文件并运行。虽然示例简单,但展示了使用`byacc`创建编译器的基本步骤,实际项目中需处理更复杂语法和实现语义动作。
|
24天前
|
Unix 编译器 Linux
Linux编译器-gcc/g++使用
Linux编译器-gcc/g++使用
|
30天前
|
Linux C语言
suse linux 11 安装GCC开发环境
suse linux 11 安装GCC开发环境
17 0
|
30天前
|
编译器 Linux C语言
Linux:编译器 - gcc
Linux:编译器 - gcc
14 4
|
1天前
|
Linux Shell 程序员
【Linux操作系统】命令的运行原理
【Linux操作系统】命令的运行原理
|
1天前
|
Linux
linux命令【JavaPub版】
linux命令【JavaPub版】
7 0
|
1天前
|
Linux 开发工具
Linux下视频截取命令 使用【ffmpeg】使用
Linux下视频截取命令 使用【ffmpeg】使用
7 1
|
2天前
|
Linux 数据处理 数据安全/隐私保护
Linux中的groups命令:管理用户组信息的利器
`groups`命令在Linux中用于显示用户所属的用户组,帮助管理员进行权限管理。它读取`/etc/group`和`/etc/passwd`文件获取信息,特点是简单直观,支持多用户组。命令参数如`-a`显示主组,`-g`显示主组ID,`-n`以数字形式显示,`-r`显示实际组。在实际应用中,结合其他命令可进行权限分析和定制输出。注意权限问题及用户组可能随系统变化。
|
2天前
|
关系型数据库 Linux 数据处理
深入了解Linux命令gprof:数据处理和分析利器
gprof是Linux下的一款命令行工具,用于分析程序性能,找出代码瓶颈。它通过分析函数调用和执行时间,提供函数级别的性能报告和图形化展示。使用gprof需在编译时添加`-pg`选项,然后运行程序并用gprof生成报告。注意覆盖所有执行路径,并可与其他性能工具结合使用,以优化代码性能。