在Linux中使用gcc/g++编译代码

简介: 1.方法速记直接编译语法:将text.c文件或者text.cpp文件直接编译成text文件。gcc text.c -o text // gcc-o text.c textg++ text.cpp -o text // g++ text.cpp -o text

1.方法速记

直接编译语法:将text.c文件或者text.cpp文件直接编译成text文件。

  • gcc text.c -o text // gcc-o text.c text
  • g++ text.cpp -o text // g++ text.cpp -o text
  • 注意:-o后面一定对应着目标文件(可执行文件)就好啦。

2.具体过程

2.1 预处理阶段

预处理的过程就是头文件包含,去注释,宏替换的过程。

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

将text.c文件预处理后变成text.i文件

  • gcc -E text.c -o text.i
    -E的选项是让gcc在预处理结束后就停止编译。


169e67106562485ba27f3cd8aad73c42.png

观察可以看到,预处理过后的文件800多行,头文件被包含在里面,并且观察main里面,具体的注释已经被去掉。

2.2 编译阶段

编译阶段是指将预处理后的代码变成汇编语言。

将text.c变成text.s或者将text.i变成text.s:

  • gcc -S text.i -o text.s
    -S:从现在开始进行编译,如果编译成功就停止下来。


50be47492b384c5a924fb070565a7df9.png

2.3 汇编阶段

将汇编语言变成二进制代码。

将text.c/text.s文件变成text.o文件:

  • gcc -c text.s -o text.o
  • .o文件又叫可重定位目标文件。
    -c:从现在开始进行程序的翻译,如果汇编完成,就停下来。

使用od -x 文件命令,查看机器代码:


ac9d71ad045844a0b413ee134d1c532f.png

2.4链接阶段

将汇编阶段生成的.s文件转成目标文件(可执行文件)。

将text.o文件链接成可执行文件text:

  • gcc text.o -o -text


13a1ac14a2bc4747be0c5f7bd22e4a09.png

2.4.1 链接的细节

链接:动态链接和静态链接。

动态链接是将库(动态库.so)中我要的方法地址,填入我的可执行程序中,建立关联。(节省资源)

静态链接是直接将库(静态库.a)中的方法真的拷贝到我们的可执行程序中。(占用资源)

gcc或者g++默认使用动态链接编译过程。

  • 查看文件链接属性
  • file 文件名


48d9fb6f36df40018de2f76cf92f4a18.png

  • 将源程序采用静态链接的策略
  • gcc text.c -o text-s -static
    -static:生成的目标文件采用静态链接


18240e092ea241a5ad1aeadee83820b0.png

观察到文件大小差异很大。

在C程序中,并没有定义"printf"函数的实现,并且在预编译中的“stdio.h”头文件中只有该函数的声明,并没有该函数的实现,那么程序是如何运行"printf"的呢?

事实上,gcc默认是动态链接,预处理把printf函数的声明放到.i文件后,链接阶段可以根据该函数的声明(该函数定义的地址)找到函数的实现,从而实现连接过程。

可以使用ldd指令查看程序链接动态库的情况:


dbf45ef194244a82ad4eee8b21742ca2.png

gcc和g++的操作一样,g++的方法就仅需把gcc换成g++即可。

目录
相关文章
|
14天前
|
Ubuntu Linux Shell
Linux 系统中的代码类型或脚本类型内容
在 Linux 系统中,代码类型多样,包括 Shell 脚本、配置文件、网络配置、命令行工具和 Cron 定时任务。这些代码类型广泛应用于系统管理、自动化操作、网络配置和定期任务,掌握它们能显著提高系统管理和开发的效率。
|
29天前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
81 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
1月前
|
Linux 编译器 C语言
【Linux快速入门(一)】Linux与ROS学习之编译基础(gcc编译)
【Linux快速入门(一)】Linux与ROS学习之编译基础(gcc编译)
|
15天前
|
Linux
Linux - 如何编译源码安装软件
源码编译安装通常包括三个步骤:1) `./configure` 检测平台特征和依赖项,生成 Makefile;2) `make` 编译源码,生成可执行文件;3) `make install` 将可执行文件安装到指定目录并配置环境变量。
30 0
|
1月前
|
Linux 编译器 C语言
Linux c/c++之多文档编译
这篇文章介绍了在Linux操作系统下使用gcc编译器进行C/C++多文件编译的方法和步骤。
39 0
Linux c/c++之多文档编译
|
1月前
|
Linux C语言 C++
vsCode远程执行c和c++代码并操控linux服务器完整教程
这篇文章提供了一个完整的教程,介绍如何在Visual Studio Code中配置和使用插件来远程执行C和C++代码,并操控Linux服务器,包括安装VSCode、安装插件、配置插件、配置编译工具、升级glibc和编写代码进行调试的步骤。
193 0
vsCode远程执行c和c++代码并操控linux服务器完整教程
|
2月前
|
Java Linux Python
Linux环境下 代码java调用python出错
Linux环境下 代码java调用python出错
53 3
|
1月前
|
Linux 开发工具
【Linux快速入门(二)】Linux与ROS学习之编译基础(make编译)
【Linux快速入门(二)】Linux与ROS学习之编译基础(make编译)
|
2月前
|
Linux Shell Python
9-7|salt代码在linux机子那个目录
9-7|salt代码在linux机子那个目录
|
2月前
|
Linux
用clang编译Linux内核
用clang编译Linux内核