【Linux入门】Linux编译器gcc/g++基础

2023-11-09

1.背景知识

注:本篇的myfile只是为了方便讲解自己起的文件名。

gcc/g++是编译器——将文本文件翻译为二进制可执行文件。

程序的翻译可分为四个阶段:

  1. 预处理(头文件展开、条件编译、宏替换、去注释等,处理完还是c语言)
    用gcc -E myfile.c -o myfile.i生成myfile.i,对比可发现.i文件比自己写的.c文件要多很多,多出的内容是将头文件中的内容拷贝到了源文件中——头文件展开。
  2. 编译(检查语法,生成汇编)
    用gcc -S myfile.i -o myfile.s生成mufile.s,打开可发现代码又从.i的大文件变小了——生成了汇编
  3. 汇编(生成机器可识别代码:汇编 -> 可重定位目标二进制文件bin.obj,且不可执行
    ——只把我们自己的代码进行翻译形成二进制文件。
    用gcc -c myfile.s -o myfile.o生成mufile.o,.o为目标二进制文件(与windows下的.obj对等),打开会发现都是乱码,并且不可执行。
  4. 链接(生成可执行文件或库文件)
    ——将我们自己的代码形成的.obj文件和库文件进行合并,形成可执行程序
    用gcc myfile.o -o myfile生成myfile(不用-o指定则会默认生成a.out),myfile为可执行文件。

翻译过程总结


补充:
1.有几个源文件(.c)就生成几个.obj文件;
2.头文件(.h)则在预处理阶段就合并到源文件的特定位置中了(头文件展开);


2.gcc/g++的用法

1.格式:gcc [选项] 要编译的文件 [选项] [目标文件]
如果不加选项对文件直接使用gcc,比如gcc myfile.c会把程序翻译的四个阶段一次直接走完,生成一个a.out可执行文件,可以直接使用 ./a.out 对其进行执行。

[选项]:

  1. -o :将生成的文件输出到指定名称的文件中。(-o后面必定跟自己想生成的文件名) 用法:gcc -o myfile myfile.c或者gcc myfile.c -o myfile,将gcc生成的a.out输出到myfile中。

  2. -E :进行程序的翻译,但是在预处理结束就停止。 用法:gcc -E myfile.c -o myfile.i,将预处理生成的文件输出到myfile.i中。

  3. -S :进行程序的翻译,但是在编译结束就停止。 用法:gcc -S myfile.c或gcc -S myfile.i,从.c文件或从.i文件执行都可以,默认输出到myfile.s文件。 也可以gcc -S myfile.c -o
    mufile.s或gcc -S myfile.i -o mufile.s显式写出输出到.s文件中。

  4. -c : 进行程序的翻译,但是在汇编结束就停止。 用法:gcc -c myfile.c或gcc -c myfile.i或gcc -c myfile.s,从.c、.i、.s文件执行都可以,默认输出到myfile.o文件。 也可以gcc -c
    myfile.c -o mufile.o或gcc -S myfile.i -o mufile.o或gcc -c
    myfile.o显式写出输出到.o文件中。


3.指令补充

3.1.ldd指令

指令补充:

  • ldd : ldd [可执行程序],查看可执行程序依赖了哪些库(只能看动态链接的库

3.2.file指令

指令补充:

  • file :file [选项] 文件或目录,可以查看文件的类型
    [选项]:
    -c 详细显示指令执行过程
    -z 尝试去解读压缩文件的内容

4.Linux下的头文件、库

为什么在Linux下可以进行C\C++代码的编写与编译呢?
因为Linux已经携带了语言级别的头文件语言对应的库

  1. 头文件
    在Linux下,头文件一般在/user/include目录下。
  2. 库(Linux下)——使用 ldd [可执行文件] 可以查看程序链接库的地址
    库分两种,静态库和动态库。库的名字是去掉前缀lib、去掉后缀.a/.so剩下的
    静态库:libXXX.a (windows下为.lib)
    动态库:libXXX.so (windows下为.dll)
    例如:查看ldd myfile ,其中有一行会显示libc.so.6 => /lib64/libc.so.6,此时ls /lib64/libc.so.6 -al查看文件的详细信息,会显示 /lib64/libc.so.6 -> libc-2.17.so发现这个库的名字是c-2.17,这个库就是c语言的c标准库

(我们在windows下使用vs,安装软件时最重要的就是下载安装语言的头文件和库!)


4.1.指令的库

在Linux下,我们所使用的指令,相当一部分都是用C语言写的。

例如:
我们使用which ls查看ls的文件地址为/user/bin/ls,然后使用ldd
/user/bin/ls查看ls文件的库,可以发现其中也有libc.so.6 =>
/lib64/libc.so.6 C语言库,ls也是使用C语言写的。
在这里插入图片描述
也可以使用上述流程去查看别的指令的库,可以发现大部分语言都是使用C语言写的。

所以其实指令也是程序,和我们自己写的程序没有本质区别。


4.1.1.动态库

动态库 == 共享库
动态库被所有程序所共享,所以一般只有一份,并且具有只读属性,不允许别人修改。
如果动态库被删除,所有依赖这个动态库的程序都将无法正常运行
在链接器链接的时候,只需要把库中对应程序的地址填到所需的地方就完成了链接。

4.1.2.静态库

将所需要的代码直接拷贝到自己的程序中。
连接成功后,如果库被删除,程序依旧可以运行。


4.1.3.动静态库的优缺点

动静态库的区别:
静态库–>拷贝所需代码本体–>直接在自己的程序中运行–>静态链接成功就不再依赖库,独立运行,库缺失也可运行。
动态库–>拷贝所需代码地址–>运行时需要跳转到库中–>动态链接成功还是需要依赖库,库缺失不能运行。
静态库:因为是拷贝代码本体,所以比较浪费空间。
动态库:因为可以被共享,永远在库中,程序中只有地址,比较节省空间。


5.gcc/g++静态链接与动态链接的方法

Linux默认使用的是动态链接与动态库!
如果想使用静态链接,要在编译时使用-static选项:

  • -static :使用静态链接库

例如:
gcc myfile.c -o myfile_static -static(myfile_static是自定义文件名)
此时生成的文件,使用ldd myfile_static是无法查看链接了哪些库的;
使用file myfile_static查看文件信息,可以看到这个程序是静态链接的。

6.静态库的安装

一般的云服务器,默认都只有动态链接
使用yum install glibc-static libstdc++-static -y可以进行c、c++静态库的安装。
(或者sudo执行)

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

【Linux入门】Linux编译器gcc/g++基础 的相关文章

随机推荐

  • 课设:影院管理系统

    影院管理系统 导言 知识点总结 课设介绍 导言 从3月份开始到现在 大概两周多的时间 写了一个影院管理系统 功能有待改善 有的功能还有点bug需要该 现在总结一下 影院管理系统告一段落 接下来要学习算法和数据结构 知识点总结 一 三层架构
  • 一文看懂npm、yarn、pnpm之间的区别

    本文作者对比了当前主流的包管理工具npm yarn pnpm之间的区别 并提出了合适的使用建议 以下为译文 NPM npm是Node js能够如此成功的主要原因之一 npm团队做了很多的工作 以确保npm保持向后兼容 并在不同的环境中保持一
  • 大数据毕设选题 - 深度学习口罩佩戴检测系统(python OpenCV YOLO)

    文章目录 0 前言 1 课题介绍 2 算法原理 2 1 算法简介 2 2 网络架构 3 关键代码 4 数据集 4 1 安装 4 2 打开 4 3 选择yolo标注格式 4 4 打标签 4 5 保存 5 训练 6 实现效果 6 1 pyqt实
  • Linux(ubuntu)上安装RDP Server(Xrdp)使用的注意事项

    ubuntu上的基本安装方法 1 apt get install xrdp 基本上就已经安装完成了 但是此时连接会出现异常 类似黑屏的情况 原因 1 Xrdp不支持unity 3D的图形 解决方法 1 使用xfce或者gnome 2d等 如
  • C#小知识

    项目编译后复制文件到生成目录 方法1 对于单个文件 可以点击属性 输出目录里选择始终复制 方法2 把项目中的ServerScripts复制到输出目录 在项目设置中 生成事件里添加批处理 xcopy ProjectDir ServerScri
  • anaconda用法

    查看已经安装的包 pip list 或者 conda list 安装和更新 pip install requests pip install requests upgrade 或者 conda install requests conda
  • LINUX权限-bash: ./startup.sh: Permission denied

    LINUX权限 bash startup sh Permission denied 执行 startup sh 或者 shutdown sh的时候 报 Permission denied 需要用命令 chmod 修改一下bin目录下的 sh
  • spring boot配置双Kafka方法

    第一步 application yml的配置 server port 8080 spring application name demo kafka one bootstrap servers xxx xxx xxx xxx consume
  • android动态毛玻璃,Android模糊处理简单实现毛玻璃效果

    自从iOS系统引入了Blur效果 也就是所谓的毛玻璃 模糊化效果 磨砂效果 各大系统就开始竞相模仿 这是怎样的一个效果呢 我们先来看一下 如下面的图片 实现效果大家都知道了 如何在Android中实现呢 说白了就是对图片进行模糊化处理 小编
  • Vue项目生成二维码

    场景 民主测评 闭卷测试 Vue项目生成二维码 使用手机浏览器扫码录入答题 一 创建vue项目 样式布局 接口联调 npm run build 打包成dist 文件 让后台发送到服务器中 页面地址就获取到了 二 前引入vue qr 二维码地
  • openwrt 编译笔记

    错误一 Creating filesystem with parameters Size 50331648 Block size 4096 Blocks per group 32768 Inodes per group 6000 Inode
  • 基于OpenCV-Python实现的人脸识别

    在初步学习了数字图像处理的相关知识并在Matlab进行了初步的模拟后 我将学习的中重点转向了Python环境下的OpenCV库的学习 以此博客记录一下学习的进程 本文章代码主要参考OpenCV库源代码 刘波译的 OpenCV3计算机视觉Py
  • Apache Tomcat

    简介 简而言之 Tomcat是一个免费的开放源代码的Web应用服务器 属于轻量级应用服务器 Apache Tomcat Tomcat是Apache 软件基金会 Apache Software Foundation 的Jakarta 项目中的
  • 邻接矩阵广度优先遍历算法 连通图采用邻接表深度优先遍历的非递归过程 图G中距离顶点v的最短路径长度最大迪杰斯特拉

    1 采用邻接矩阵存储图的广度优先遍历算法的实现 参考教材算法6 5选作 2 一个连通图采用邻接表作为存储结构 设计一个算法 实现从顶点v出发的深度优先遍历的非递归过程 3 设计一个算法 求图G中距离顶点v的最短路径长度最大的一个顶点 设v可
  • 函数调用之回调函数

    重新回到CSDN 工作以来写第一个博客 不码代码 不追求高大上的专业术语 只求通俗的理解 以前听过回调函数 也研究过 但由于没有在实际中用过 所以也没太懂 每次一听到回调函数这个词 感觉很高大上 最近在工作上遇到了 而且被公司前辈广而用之
  • Pickle包的使用

    想要将Python程序运行中得到的字符串 列表 字典等数据 长久的保存下来 而不是简单的放入内存中关机断电就丢失数据 Pickle模块就是专门用来完成此功能的模块 它可以将对象转换为一种可以传输或存储的格式 它实现了基本的数据序列和反序列化
  • 如何保证token的安全

    接口的安全性主要围绕token timestamp和sign三个机制展开设计 保证接口的数据不会被篡改和重复调用 下面具体来看 Token授权机制 用户使用用户名密码登录后服务器给客户端返回一个Token 通常是UUID 并将Token U
  • Sqli-labs之Less-29和Less-30和Less-31

    Less 29 基于错误 GET 双服务器 单引号 字符型注入 服务器 两层 架构 注 截图等来自 MySQL注入天书 Less 29 服务器端有两个部分 第一部分为 tomcat 为引擎的 jsp 型服务器 第二部分为 apache 为引
  • 传输线的物理基础(十):特性阻抗的频率变化

    到目前为止 我们一直假设传输线的特性阻抗随频率保持不变 正如我们所见 从传输线前端看 输入阻抗与频率密切相关 毕竟 在低频时 远端开路的传输线的输入阻抗看起来像一个电容器 阻抗开始很高 然后下降得很低 特性阻抗是否随频率变化 在本节中 我们
  • 【Linux入门】Linux编译器gcc/g++基础

    目录 1 背景知识 2 gcc g 的用法 3 指令补充 3 1 ldd指令 3 2 file指令 4 Linux下的头文件 库 4 1 指令的库 4 1 1 动态库 4 1 2 静态库 4 1 3 动静态库的优缺点 5 gcc g 静态链