Linux工具——gcc

2023-11-08

目录

一,gcc简介

二,C语言源文件的编译过程

1.预处理

2.编译

3.汇编

 4.链接

5.动静态库 


一,gcc简介

相信有不少的小白和我一样在学习Linux之前只听说过visual  studio。其实这个gcc这个编译器实现的功能便是和visual studio一样的功能,但是gcc只能够支持c语言。如果要支持C++的话便要用到g++。

二,C语言源文件的编译过程

1.预处理

在C源文件运行时做的第一步便是预处理,在预处理的过程中要做的便是:

1.头文件展开。

2.去掉注释。

3.条件编译。

4.宏替换。

这上面的四步便是预处理时要做的四步。那我们在Linux中要如何的去观察这一个过程呢?这个时候便要使用到一个Linux的指令了。这个指令便是——gcc -E:代表的意思便是开始编译C源文件等到预处理结束以后便停止翻译。可以来段代码来看看效果。如以下代码:

#include<stdio.h> //头文件
 
  2 #define M 123 //宏定义
  3 #define v1 1  
  4 #define v2 0  
  5 #define v3 0  
 
  6 int main()  
  7 {  
  8   printf("hello Linux:%d \n",M);  
  9   printf("hello C++ :%d \n",M);  
 10   
 11 //  printf("hello Linux:%d \n",M);//注释  
 12 //  printf("hello C++ :%d \n",M);  
 13 //    
 14 //  printf("hello Linux:%d \n",M);  
 15 //  printf("hello C++ :%d \n",M);  
 16   
 17 #if(v1) //条件编译 
 18   printf("普通版本\n");  
 19 #elif(v2)  
 20     printf("会员版本\n");  
 21 #else  
 22     printf("超级会员版本\n");  
 23 #endif  
 24                                                                                                                                                                                        
 25     return 0 ;    
 26 }  

当我执行如下指令时:gcc -E texe2.c -o code.i。当我们输入这条指令时便会得到一个code.i文件。当用vim进到这个文件里面是便会看到头文件被展开了,宏被替换掉了,注释被删掉了,预处理指令只有条件成立的那一部分被留下来。

2.编译

这个编译便是代码翻译的第二步,在这个过程中我们要做的便是将英文代码变成汇编代码。在Linux 系统下输入gcc -S ,这条指令便可以生成一个经过编译后的汇编文件。比如对上述的code.i文件进行编译-gcc -S code.i -o code.s,便会得到这样一个汇编文件:

这样子便将c源文件给弄成了汇编文件了。

3.汇编

在这个过程中要做到的便是将汇编文件翻译为重定向的二进制文件。在Linux系统下输入指令:gcc -c便可。如对上述的code.s文件进行翻译便可以输入指令-code -c code.s -o code.o。在执行完这个指令以后便会形成一个code.o文件。用vim打开该文件便会是这样一个光景:

因为vim是文本编辑器,但是code.o文件却是二进制文件所以就会出现这样的错误。要打开二进制文件要调用另一个指令——od。打开后便是这样的:

我们自然是看不懂的,但是计算机就能看懂。在进行到这一步以后一个二进制文件也就是目标文件便生成了。但是此时我们还不能运行。

 4.链接

生成目标文件以后,如果要运行的话便要经过链接这一步。经过了链接这一步以后代码才可以变成一个可执行文件。在Linux环境下就是输入指令gcc 。对于上述的code.o文件也就是输入指令 ——gcc code.o -o mybin:

5.动静态库 

1.库的分类

其实可执行文件 = 头文件+代码+库。在这里头文件相当于一个功能函数声明的集合,代码就是我们调用功能函数的指令,库便是各种功能函数的定义。在这里的库便分为两种库,一种叫做动态库,一种叫做静态库。动态库的后缀是so,静态库的后缀是.a。在Linux环境下输入指令ls /usr/lib64/libc.so.6便可以查看这个动态库。

得到这个蓝色的路径便是动态库的路径。lib表示库,c表示动态库的名字,so表示是动态库,6表示版本。

2.链接方式

在Linux中有两种链接方式。一种是动态连接方式,一种是静态链接方式。这两种不同的链接方式各自有各自的优点。动态链接形成的可执行程序比较小,静态链接形成的可执行序比较大。这两种差别是因为这两种链接调用库中功能函数的方式的不同导致的。

1.动态链接是通过函数的地址来调用的,静态链接是通过将函数拷贝到可执行文件中来调用的。

2.动态库的函数调用会受到动态库的存在与否影响,但是静态库则不受这个影响。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux工具——gcc 的相关文章

  • 如果目录不存在,有没有办法让 mv 创建要移动到的目录?

    因此 如果我在主目录中并且想将 foo c 移动到 bar baz foo c 但这些目录不存在 是否有某种方法可以自动创建这些目录 以便你只需要输入 mv foo c bar baz 一切都会顺利吗 似乎您可以将 mv 别名为一个简单的
  • 如何从命令行执行 PHP 代码?

    我想执行单个 PHP 语句 例如if function exists my func echo function exists 直接使用命令行 无需使用单独的 PHP 文件 这怎么可能 如果您要在命令行中执行 PHP 我建议您安装phpsh
  • _dl_runtime_resolve -- 共享对象何时加载到内存中?

    我们有一个对性能要求很高的消息处理系统 最近我们注意到第一条消息比后续消息花费的时间要长很多倍 当它通过我们的系统时 会发生大量转换和消息增强 其中大部分是通过外部库完成的 我刚刚描述了这个问题 使用 callgrind 将仅一条消息的 运
  • 从sourceforge下载最新版本

    我正在尝试在 bash 脚本中从 Sourceforge 下载最新版本的graphicsmagick wget q https sourceforge net projects graphicsmagick files latest dow
  • 在哪里可以找到所有 C 标准库的源代码?

    我正在寻找所有 C 标准库的完整源代码 也就是说 我正在寻找 stdio h stdlib h string h math h 等的源代码 我想看看它们是如何创建的 我认为这取决于不同的平台 但 Linux 或 Windows 都会受到欢迎
  • 动态加载库和共享全局符号

    由于我在动态加载的库中观察到全局变量的一些奇怪行为 因此我编写了以下测试 首先我们需要一个静态链接库 头文件test hpp ifndef BASE HPP define BASE HPP include
  • 如何在 Linux 中显示进程状态(阻塞、非阻塞)

    有没有办法查询 Linux 进程表中进程的状态 以便能够演示执行查询时进程是正在运行还是被阻止 我的目标是从进程或程序的 外部 执行此操作 因为我希望从操作系统进程的角度来理解这一点 但欢迎任何想法 这是Python代码阻塞的过程 impo
  • 如何修复 /usr/bin/env 参数处理?

    我遇到了一个奇怪的问题 usr bin env 我设计了一个简单的脚本来显示问题 该脚本使用 Ruby 编写 但使用 Python 编写的类似脚本也会发生同样的情况 这是脚本 usr bin env ruby p ARGV 还有一个没有 u
  • Linux shell 标题大小写

    我正在编写一个 shell 脚本并有一个如下所示的变量 something that is hyphenated 我需要在脚本中的各个点使用它 如下所示 something that is hyphenated somethingthati
  • C/C++ with GCC:静态地将资源文件添加到可执行文件/库

    有人知道如何使用 GCC 将任何资源文件静态编译为可执行文件或共享库文件吗 例如 我想添加永远不会改变的图像文件 如果它们改变了 我无论如何都必须替换该文件 并且不希望它们位于文件系统中 如果这是可能的 我认为这是因为 Visual C f
  • 在 4.x 内核上的 64 位内存中查找系统调用表

    我正在尝试编写一个简单的内核模块来查找 Linux 中的 sys call table 但遇到了一些麻烦 我在这里找到了 32 位 Linux 的基本指南 https memset wordpress com 2011 03 18 sysc
  • 如何将字符串推送到标准输入?在启动时通过 stdin 提供输入,然后以交互方式读取 stdin 输入 [重复]

    这个问题在这里已经有答案了 有没有办法在调用程序时将字符串 推送 到程序的标准输入流 这样我们就可以达到这样的效果 echo something my program 但不是在之后读取 EOF something my program将从原
  • 我如何知道 std::map 插入成功还是失败?

    我在多线程应用程序中有一个映射 将名为 uuid 的类映射到指针 我想知道插入操作是否成功或失败 e g mymap insert hint MyMap value type entry uuid itemptr 如果失败的话会抛出异常或者
  • 使用 xargs 时如何获取退出代码(并行)

    我制作了一个用于启动并行 rsync 进程的脚本 bin bash LIST 1 DEST DIR 2 RSYNC OPTS 3 echo rsyncing From SRC DIR To DEST DIR RSYNC OPTS RSYNC
  • Git - 致命:无法获取当前工作目录?

    When I git clone从回购协议中 我得到 fatal Could not get current working directory No such file or directory 我该怎么办 我检查了服务器并发现 git文
  • “以下软件包将被更高优先级的频道取代”是什么意思?

    我正在尝试将 fuzzywuzzy 安装到 64 位 Linux 中的 Anaconda 发行版上 当我这样做时 它试图改变我的conda and conda env to conda forge渠道 如下 我通过以下方式在 anacond
  • 如何使用 bash 粘贴来自单独文件的列?

    我想用分隔符 合并不同的列表 第一个列表有 2 个单词 cat first one who 第二个列表有 10000 个单词 cat second languages more simple advanced home expert tes
  • 使用inotify监控文件

    我正在使用 inotify 来监视本地文件 例如使用 root temp inotify add watch fd root temp mask 删除该文件后 程序将被阻止read fd buf bufSize 功能 即使我创建一个新的 r
  • 如何像C99一样使用make和编译?

    我正在尝试使用 Makefile 编译 Linux 内核模块 obj m main o all make C lib modules shell uname r build M PWD modules clean make C lib mo
  • Docker容器内的动态监听端口

    我有一个应用程序 在使用其默认端口建立一些连接后 开始打开 侦听 新的随机端口来处理现有连接 然后删除它们 视频通话 它还在通信协议内交换其IP地址和端口 我能够解决IP地址问题 但仍然无法找到一种方法来动态告诉主机的IPTABLES在Do

随机推荐

  • <并发编程>学习笔记------(一) 并发相关理论

    前面 并发编程可以总结为三个核心问题 分工指的是如何高效地拆解任务并分配给线程 同步指的是线程之间如何协作 互斥则是保证同一时刻只允许一个线程访问共享资源 并发相关理论 可见性 原子性和有序性 核心矛盾 CPU 内存 I O 设备的速度差异
  • OpenWrt通过终端查询版本

    一 cat etc banner 二 cat proc version 三 cat etc openwrt release 四 uname a 五 opkg version
  • go操作数据库Null类型转换失败问题

    sql NullString 解决数据库中null值的问题 go操作DB需要注意的
  • 向MySQL数据库表内导入txt和csv文件数据

    本文总结了在CentOS7上使用 LOAD DATA
  • iOS开发时如何使用 Launch Screen Storyboard

    原文 http useyourloaf com blog using a launch screen storyboard 静态启动图片 启动图片是iOS加载App的时候系统响应的直观呈现 近几年 随着屏幕尺寸的增多 制作相应的静态图片就变
  • Netty消息接收类故障案例分析

    Netty 进阶之路 分布式服务框架原理与实践 作者李林锋深入剖析Netty消息接收类故障案例 李林锋此后还将在 InfoQ 上开设 Netty 专题持续出稿 感兴趣的同学可以持续关注 1 背景 1 1 消息接收类故障 尽管Netty应用广
  • 13-ESP8266连接MQTT服务器发送数据

    Author teacherXue 一 什么是MQTT 定义 MQTT是一个基于客户端 服务器的消息发布 订阅传输协议 MQTT协议是轻量 简单 开放和易于实现的 这些特点使它适用范围非常广泛 在很多情况下 包括受限的环境中 如 机器与机器
  • HTML 列表

    HTML 列表和 CSS 列表属性 在 HTML 中 列表主要有两种类型 无序列表 ul 列表项用的是项目符号标记 有序列表 ol 列表项用的是数字或字母标记 CSS 列表属性使您可以 为有序列表设置不同的列表项标记 为无序列表设置不同的列
  • 产品经理工作积累(3)

    按职业经理的层次模型产品经理又可分工匠型 元帅型和老师型 1 工匠型 工匠型产品经理主要的价值在于 在某个专业领域里其技能的娴熟程度 2 元帅型 元帅型产品经理 能够在一个领域中带领一帮人来完成一个特定的项目 他的能力体现在全局范围的组织
  • JQuery Tab 滑动们导航菜单效果

    这种效果目前互联网上用的很多希望可以给大家提供帮助 图片是采用css sprites实现的 在tab例子的基础上尽行了扩展 符合web标准 兼容多浏览器 效果01预览 http www yuyadong com test JQuery Ta
  • 云主机-生产环境下离线安装Docker部署应用

    离线安装Docker 配置Docker以及使用Docker 作为生产环境下离线部署Docker 以及使用Docker部署应用系统 下面的记录做出非常详细的操作步骤 下载Docker离线安装包 Linux版本下载地址 Index of lin
  • SERDES关键技术

    目录 一 SERDES介绍 二 SERDES关键技术 2 1 多重相位技术 2 2 线路编解码技术 2 2 1 8B 10B编解码 2 2 2 控制字符 Control Characters 2 2 3 Comma检测 2 2 4 扰码 S
  • SpringBoot项目使用通用Mapper

    SpringBoot项目使用通用Mapper 前言 后端业务开发 每个表都要用到单表的增删改查等通用方法 而配置了通用Mapper可以极大的方便使用Mybatis单表的增删改查操作 通用mapper配置 1 添加maven
  • 三种交换值的方式

    1 使用临时变量temp作为一个中转站交换 int a 4 b 9 temp temp a a b b temp 缺点 占用内存 效率最低 2 利用加减法实现两个变量之间的交换 int a 1 b 2
  • centos中 系统自带python2 无法使用pip命令

    centos中 系统自带python2 无法使用pip命令 yum y install epel release yum install python pip 升级pip 可选 pip install upgrade pip pip无法安装
  • chart.js使用用法

    下面的链接是不同的图的实例 请先看本文了解大概 再看不同的统计图的实现 使用chart js画折线图 甜甜圈图和饼状图 chart js使用用法 定义画布
  • 【Android取证篇】华为手机助手支持备份的数据类型-支持第三方应用

    Android取证篇 华为手机助手支持备份的数据类型 支持第三方应用 数据备份至电脑端 使用数据线或WLAN连接 取证注意断网操作 suy 文章目录 Android取证篇 华为手机助手支持备份的数据类型 支持第三方应用 一 支持备份的数据
  • 这个小程序厉害了!一键生成花式昵称,让你的微信从此与众不同!

    微信作为互联网时代的主要通讯工具 已经有10亿人在使用了 看朋友圈好友的微信昵称也是千奇百怪 如何才能制作专属于自己的昵称呢 今天小编给大家分享一款有意思的微信小程序 能够帮助我们制作出不一样的微信昵称 一起来看看吧 第一步 在微信中搜索
  • Makefile篇卷首语

    2023年5月24日 周三下午 今天我决定开始学习Makefile 一是因为很多开源软件都有Makefile 不会Makefile真的不行 我不知道怎么用Makefile来生成软件 也无法通过Makefile来查看我缺了什么依赖 因为我看不
  • Linux工具——gcc

    目录 一 gcc简介 二 C语言源文件的编译过程 1 预处理 2 编译 3 汇编 4 链接 5 动静态库 一 gcc简介 相信有不少的小白和我一样在学习Linux之前只听说过visual studio 其实这个gcc这个编译器实现的功能便是