当前位置: 首页 > news >正文

【Linux学习】菜鸟入门——gcc与g++简要使用

一、gcc/g++

  gcc/g++是编译器,gccGCC(GUN Compiler Collection,GUN编译器集合)中的C编译器g++是GCC中的C++编译器。使用g++编译文件时会自动链接STL标准库,而gcc不会自动链接STL标准库。下面简单介绍一下Linux环境下(Windows差别不大),程序翻译的过程:

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

gcc -E filename.c -o filename.o

其中, -E 从现在开始进行程序的翻译,预处理做完,就停下来。

1.2 编译(C/C++语言 --> 汇编语言)

gcc -S filename.c
//默认生成filename.s文件
gcc -S filename.c -o filename.s
//亦可以
gcc -S filename.i
gcc -S filename.i -o filename.s

其中,参数 -S 从现在开始进行程序的翻译,当编译做完,就停下来。下图为程序预处理编译过程中形成的目标文件test.i与test.s。

image-20230302165934759

1.3 汇编(汇编 --> 可重定位目标二进制文件,不可以被执行的,bin.obj)

简单来说,汇编的具体功能,就是把我们自己的代码进行翻译形成二进制目标文件。

gcc -c filename.s
gcc -c filename.s -o filename.o

其中, -c 从现在开始进行程序的翻译,当汇编做完就停下来。

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

gcc filename.o -o filename//可自定义输出的文件名
gcc -o filename filename.o//亦可以

其中,-o 后面是指定生成的可执行程序的名称

二、链接

  指令ldd能够检测当前被形成的可执行程序都依赖哪些库:

ldd 可执行程序名

image-20230302165338328

为什么我们能够在Linux下进行C/C++代码的编写和编译?这是因为Linux系统默认已经携带了语言级别的头文件和语言对应的。centos中,头文件一般在/usr/include/路径下:

image-20230302170319292

此外,库本质上也是文件,其分为两种:静态库和动态库;

​ 静态库:lib开头+库名+.a结尾;

​ 例如libXXXXXXX.a

​ 动态库:lib开头+库名+.so结尾;

​ 例如libXXXXXXX.so

  为了更直观地讲述静态/动态库名,进行了ldd指令检测当前可执行程序使用的依赖库,下图中,m-2.17为动态库名。Linux的指令相当一部分是用C语言编写的,因而指令就是程序、工具。

image-20230302171030807

image-20230302171307192

动静态库的小结

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

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

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

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

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

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

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

注意:Linux默认使用的是动态链接和动态库

image-20230303124142208

  上图中,通过file test.cpp可以确认test.cpp是一个C++代码,亦是一个文本类文件;file mytestELF可执行程序,64-bit LSB executable表示64位的可执行程序,dynamically linked动态共享连接。

image-20230303130351494

  上图中,在使用静态库编译test.cpp时,出现了无法找到静态库的故障,这是因为Linux系统中,默认没有安装静态库,需要用户自行安装。C++静态库的安装指令:

sudo yum install glibc-static libstdc++-static -y

  下图中,使用动态库生成的可执行程序myfile占用9064bit,使用静态库生成的可执行程序myfile-static明显比动态库生成的可执行程序占用空间大得多。

image-20230303133433150

使用file指令能够直接看出可执行程序myfile-static使用了静态库进行程序的链接。

image-20230303133656665

三、自动化构建工具make/Makefile

  在Linux中编写一个程序,每次编译时都需要一行一行地敲命令,对于小程序还好,而对大型程序就不是很友好,不但浪费时间还会输入命令错误。面对这些情况,Linux提供了make命令和makefile文件来解决这类问题。make是一个命令,makefile是一个文件且其位于当前源代码路径下。

3.1 案例

  在test_03_02目录下,创建myfile.cc的C++文件,以及Makefile文件:

image-20230303141252956

下图为Makefile文件中的内容,其中myfile是形成可执行程序的目标文件,它需要依赖myfile.c文件。

image-20230303141126311

make命令,自动在当前路径下查找Makefile文件,执行文件中内置好的命令。

image-20230303141345348

3.2 规则

makefile是一个围绕依赖关系和依赖方法构建的一个自动化编译的工具,包含了依赖关系和依赖方法:

image-20230303142130860

注意:依赖关系中,目标文件对应的依赖文件列表可以空

直接使用make命令进行自动化编译,生成了myfile.i、myfile.s、myfile.o和myfile这四个文件。

image-20230303150715942

文件有生成必然就有清理,make依然提供清理的能力:

image-20230303150600200

  使用了make指令后,继续使用make编译时却不被允许,而make clean却可以多次执行,这是因为清理使用了.PHONY进行了欺骗,make的过程也可以。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yN2GfUxa-1677849319595)(https://gitee.com/joes_ju/personal_images/raw/master/img/202303031530148.png)]

.PHONY:目标文件
//总是被执行的

导致使用make命令后不能继续使用make命令,是由于源代码文件myfile.cc的修改时间早于目标文件myfile的修改时间,因此myfile比myfile.cc新,不需要再执行编译。

image-20230303153137493

对于这种现象,除了使用.PHONY欺骗外,亦可通过touch一个已经存在的文件,其作用是更新该文件的修改时间:

image-20230303153545563

在这里插入图片描述

相关文章:

【Linux学习】菜鸟入门——gcc与g++简要使用

一、gcc/g gcc/g是编译器,gcc是GCC(GUN Compiler Collection,GUN编译器集合)中的C编译器;g是GCC中的C编译器。使用g编译文件时会自动链接STL标准库,而gcc不会自动链接STL标准库。下面简单介绍一下Linux环境下(Windows差…...

Cadence Allegro 导出Bill of Material Report详解

⏪《上一篇》   🏡《总目录》   ⏩《下一篇》 目录 1,概述2,Assigned Functions Report作用3,Assigned Functions Report示例4,Assigned Functions Report导出方法4.1,方法14.2,方法2B站关注“硬小二”浏览更多演示视频...

localStorage线上问题的思考

一、背景: localStorage作为HTML5 Web Storage的API之一,使用标准的键值对(Key-Value,简称KV)数据类型主要作用是本地存储。本地存储是指将数据按照键值对的方式保存在客户端计算机中,直到用户或者脚本主动清除数据&a…...

什么是DNS域名解析

什么是DNS域名解析?因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过主机名,得到该主机名对应的IP地址的过程叫做域名解析。正向解析&#xff1a…...

Cadence Allegro 导出Assigned Functions Report详解

⏪《上一篇》   🏡《总目录》   ⏩《下一篇》 目录 1,概述2,Assigned Functions Report作用3,Assigned Functions Report示例4,Assigned Functions Report导出方法4.1,方法14.2,方法2B站关注“硬小二”浏览更多演示视频...

Python中Opencv和PIL.Image读取图片的差异对比

近日,在进行深度学习进行推理的时候,发现不管怎么样都得不出正确的结果,再仔细和正确的代码进行对比了后发现原来是Python中不同的库读取的图片数组是有差异的。 image np.array(Image.open(image_file).convert(RGB)) image cv2.imread(…...

win10 WSL2 使用Ubuntu配置与安装教程

Win10 22H2ubuntu 22.04ROS2 文章目录一、什么是WSL2二、Win10 系统配置2.1 更新Windows版本2.2 Win10系统启用两个功能2.3 Win10开启BIOS/CPU开启虚拟化(VT)(很关键)2.4 下载并安装wsl_update_x64.msi2.5 PowerShell安装组件三、PowerShell安装Ubuntu3.…...

LeetCode每日一题(28. Find the Index of the First Occurrence in a String)

Given two strings needle and haystack, return the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack. Example 1: Input: haystack “sadbutsad”, needle “sad” Output: 0 Explanation: “sad” occurs at index 0 and…...

Android 圆弧形 SeekBar

效果预览package com.gcssloop.widget;import android.annotation.SuppressLint;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Matrix;import android.graph…...

java 字典

java 字典 数据结构总览 Map Map 描述的是一种映射关系,一个 key 对应一个 value,可以添加,删除,修改和获取 key/value,util 提供了多种 Map HashMap: hash 表实现的 map,插入删除查找性能都是 O(1)&…...

【企业服务器LNMP环境搭建】mysql安装

MySQL安装步骤: 1、相关说明 1.1、编译参数的说明 -DCMAKE_INSTALL_PREFIX安装到的软件目录-DMYSQL_DATADIR数据文件存储的路径-DSYSCONFDIR配置文件路径 (my.cnf)-DENABLED_LOCAL_INFILE1使用localmysql客户端的配置-DWITH_PARTITION_STORAGE_ENGINE使mysql支持…...

vue自定义指令以及angular自定义指令(以禁止输入空格为例)

哈喽,小伙伴们,大家好啊,最近要实现一个vue自定义指令,就是让input输入框禁止输入空格建立一个directives的指令文件,里面专门用来建立各个指令的官方文档:自定义指令 | Vue.js (vuejs.org)我们都知道vue中…...

异常 复习

异常复习 异常(广义):泛指程序中一切不正常的情况 错误:例如内存不够用,程序是无法解决的 异常(狭义):程序在运行中出现问题,但是可以通过异常处理机制处理,程序可以继续向后执行 异常体系 Throwable类有两个直接子类:Excepti…...

K8s:开源安全平台 kubescape 实现 Pod 的安全合规检查/镜像漏洞扫描

写在前面 生产环境中的 k8s 集群安全不可忽略,即使是内网环境容器化的应用部署虽然本质上没有变化,始终是机器上的一个进程但是提高了安全问题的处理的复杂性分享一个开源的 k8s 集群安全合规检查/漏洞扫描 工具 kubescape博文内容涉及: kube…...

C#中,FTP同步或异步读取大量文件

一次快速读取上万个文件中的内容 在C#中,可以使用FTP客户端类(如FtpWebRequest)来连接FTP服务器并进行文件操作。一次快速读取上万个文件中的内容,可以采用多线程的方式并发读取文件。 以下是一个示例代码,用于读取FT…...

STM32单片机的FLASH和RAM

STM32内置有Flash和RAM(而RAM分为SRAM和DRAM,STM32内为SRAM),硬件上他们是不同的设备存储器、属于两个器件,但这两个存储器的寄存器输入输出端口被组织在同一个虚拟线性地址空间内。 MDK预处理、编译、汇编、链接后编…...

Java 二叉树的遍历

二叉树的遍历(traversing binary tree)是指从根结点出发,按照某种次序依次访问二叉树中所有的结点,使得每个结点被访问依次且仅被访问一次。前序遍历(根 左 右)先访问根结点,然后前序遍历左子树…...

实习日记-C#

数据类型 字符串常量 string a "hello, world"; // hello, world string b "hello, world"; // hello, world string c "hello \t world"; // hello world string d "hello \t wor…...

Tech Lead如何引导团队成员解决问题?

作为一个开发团队的Tech Lead,当团队成员向你寻求帮助时,你有没有说过下面这些话? 你别管了,我来解决这个问题你只要。。。就行了你先做其他的吧,我研究一下,然后告诉你怎么做 当我们说这些话时&#xff…...

07--组件

一、小程序组件分类微信团队为开发者提供了一系列基础组件,开发者可以通过组合这些基础组件进行快速开发。小程序中的组件也是非常丰富的,开发者可以基于组件快速搭建出漂亮的页面结构。小程序中的组件其实相当于网页中的HTML标签,只不过标签…...

怎么做好一个完整的项目复盘

复盘,是运营必不可少的能力,小到一次买菜的经历,大到百亿千亿的投资项目,都可以通过复盘来总结规律、提升水平。简单说来,复盘可以达到的效果有两条:优化弱项,强化强项明确自己的价值&#xff0…...

浅谈一下mysql8.0与5.7的字符集

修改字符集 修改步骤 在MySQL8.0版本之前,默认字符集为1atin1,utf8字符集指向的是utf8mb3。网站开发人员在数据库设计的时候往往会将编码修改为ut8字符集。如果遗忘修改默认的编码,就会出现乱码的问题。从MySQL8.0开始,数据库的默认编码将改…...

paddle推理部署(cpu)

我没按照官方文档去做,吐槽一下,官方文档有点混乱。。一、概述总结起来,就是用c示例代码,用一个模型做推理。二、示例代码下载https://www.paddlepaddle.org.cn/paddle/paddleinferencehttps://github.com/PaddlePaddle/Paddle-In…...

想开发IM集群?先搞懂什么是RPC!

即时通讯网官方技术群和社区里,经常有开发者在纠结怎么开发IM集群,虽然真正的使用人数,可能用个人电脑单机都能支撑。你也许会说,明明不需要用到IM集群,干吗要自找麻烦?答曰:“老板说这个得有&a…...

案例13-前端对localStorage的使用分析

一:背景介绍 前端在调用后端接口获取某一个人的评论次数、获赞次数、回复次数。调用之后判断后端返回过来的值。如果返回回来的值是0的话,从缓存中获取对应的值,如果从缓存中获取的评论次数为空那么其他两个的次数也为0。 二:思路…...

CNNIC第51次中国互联网络发展状况统计报告用户规模变化发布、解读与白杨SEO看法

一、第51次《中国互联网络发展状况统计报告》发布 3月2日,中国互联网络信息中心(简称CNNIC)在京发布第51次《中国互联网络发展状况统计报告》。《报告》显示,截至2022年12月,我国网民规模达10.67亿,较2021…...

【数据结构】单链表的实现

本篇主要总结单链表是如何实现的,数据结构是如何管理数据的,详细的介绍每一步是如何实现以及各种注意事项。🚀1.单链表的实现🚀🍭1.1单链表的尾插🍭1.2单链表的头插🍭1.3单链表的打印&#x1f3…...

从0到1做产品!产品设计的6个步骤

相信不少产品经理在刚入行时,都遇到过这样的情况: 接到需求后不知所措,然后下意识地照着竞品开始盲目地画原型。 其实,这样的设计过程不仅缺乏逻辑性,在后续阶段也很容易出现各种问题。 在此,跟大家分享一下…...

ESP32遥控器软硬件设计

一. 前言 做智能车 或者 四轴飞控怎么能少得了遥控器呢!在这里给大家分享一个简单的基于ESP32遥控器的设计,包括软硬件以及3D外壳。 二. 硬件设计 1. 功能介绍 遥控器嘛,通信方式是最重要的,本设计支持 WIFI、蓝牙 和 2.4G&…...

vue-template-admin的keep-alive缓存与移除缓存

一,场景 A页面是表单页面,填写后需要跳转B页面。如果B页面不操作返回的话,应该能还原A页面的内容,而如果B页面点击提交,再回到A页面的时候,应该清除缓存。 二,实现方法 A页面要缓存数据&…...

上海市工商网站官网/免费拓客软件

使用范围: OA、MIS、ERP等信息管理类的项目,暂时不考虑网站。 遇到的问题: 完成一个项目,往往需要引用很多js文件,比如jQuery.js、easyUI等。还有自己写的一些列js文件,那么这些文件如何方便的加载&#xf…...

wordpress语言设置/企业优化推广

好久没技术,但手痒,写数学也行吧...试试... 市场上有很多好的教材,这里只为自己记忆,做笔记而用,无他.很多资料可能也是转载的,帮助自己消化,也便于以后自己参考 一.随机试验和随机事件 如果一个试验在相同条件下可以重复进行,而每次试验的可能结果不止一个&#xf…...

网站怎么做前台跟后台的接口/全网推广公司

两种注册类型的区别是: 1)第一种不是常驻型广播,也就是说广播跟随activity的生命周期。注意: 在activity结束前,移除广播接收器。 2)第二种是常驻型,也就是说当应用程序关闭后,如果有信息广播来,程序也会被…...

普通网站做/百度官网进入

vs更新2017最新版本后,项目调试浏览器莫名其妙出现闪退,每次都TMD想打人… 先说下vs更新后出现哪些反人类的操作: –1.每调试一个项目就会单独重启浏览器,而且该调试浏览器关闭后,vs调试也会关闭。 –2.在web中调试&…...

制作流程图的网站/湖南百度推广公司

实现虚拟化的方法不止一种,各种方法都可以通过不同层次的抽象来实现相同的结果。本文将给大家介绍Linux中常用的4种虚拟化方法,以及它们相应的优缺点。业界有时会使用不同的术语来描述相同的虚拟化方法。(1)硬件仿真。毫无疑问,最复杂的虚拟化…...

电子商务网站规划流程/网络推广网站推广方法

转自:http://www.cnblogs.com/jcchen1987/p/4581651.html 关于boost算法 boost算法是基于PAC学习理论(probably approximately correct)而建立的一套集成学习算法(ensemble learning)。其根本思想在于通过多个简单的弱分类器,构建…...