【Linux学习】菜鸟入门——gcc与g++简要使用
一、gcc/g++
gcc/g++是编译器,gcc是GCC(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。

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 可执行程序名

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

此外,库本质上也是文件,其分为两种:静态库和动态库;
静态库:lib开头+库名+.a结尾;
例如libXXXXXXX.a
动态库:lib开头+库名+.so结尾;
例如libXXXXXXX.so
为了更直观地讲述静态/动态库名,进行了ldd指令检测当前可执行程序使用的依赖库,下图中,m-2.17为动态库名。Linux的指令相当一部分是用C语言编写的,因而指令就是程序、工具。


动静态库的小结:
库分为静态库(专门让编译器,对用户的程序进行静态链接的)和动态库(专门让编译器,对用户的程序进行动态链接的);
静态库和静态链接:链接的时候,如果是静态链接,找到静态库,拷贝静态库中的我们所需要的代码到自己的可执行程序中;
动态库和动态链接:链接的时候,如果是动态链接,找到动态库,拷贝动态库中我们所需要的代码的地址到自己的可执行程序中相关的位置;
静态链接成功:我们的程序,不依赖任何库,自己就可以独立运行;
动态链接成功:我们的程序,还是依赖动态库,一旦动态库缺失,我们的程序便无法运行;
静态库,因为自身拷贝的问题,比较浪费空间;
动态库,亦是共享库,因为可以做到被大家共享方法,所以真正的实现永远都在库中,程序内部只有地址,比较节省空间;
注意:Linux默认使用的是动态链接和动态库。

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

上图中,在使用静态库编译test.cpp时,出现了无法找到静态库的故障,这是因为Linux系统中,默认没有安装静态库,需要用户自行安装。C++静态库的安装指令:
sudo yum install glibc-static libstdc++-static -y
下图中,使用动态库生成的可执行程序myfile占用9064bit,使用静态库生成的可执行程序myfile-static明显比动态库生成的可执行程序占用空间大得多。

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

三、自动化构建工具make/Makefile
在Linux中编写一个程序,每次编译时都需要一行一行地敲命令,对于小程序还好,而对大型程序就不是很友好,不但浪费时间还会输入命令错误。面对这些情况,Linux提供了make命令和makefile文件来解决这类问题。make是一个命令,makefile是一个文件且其位于当前源代码路径下。
3.1 案例
在test_03_02目录下,创建myfile.cc的C++文件,以及Makefile文件:

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

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

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

注意:依赖关系中,目标文件对应的依赖文件列表可以空
直接使用make命令进行自动化编译,生成了myfile.i、myfile.s、myfile.o和myfile这四个文件。

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

使用了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新,不需要再执行编译。

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


相关文章:
【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地址的过程叫做域名解析。正向解析:…...
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,当团队成员向你寻求帮助时,你有没有说过下面这些话? 你别管了,我来解决这个问题你只要。。。就行了你先做其他的吧,我研究一下,然后告诉你怎么做 当我们说这些话时ÿ…...
07--组件
一、小程序组件分类微信团队为开发者提供了一系列基础组件,开发者可以通过组合这些基础组件进行快速开发。小程序中的组件也是非常丰富的,开发者可以基于组件快速搭建出漂亮的页面结构。小程序中的组件其实相当于网页中的HTML标签,只不过标签…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
C语言中提供的第三方库之哈希表实现
一. 简介 前面一篇文章简单学习了C语言中第三方库(uthash库)提供对哈希表的操作,文章如下: C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...
如何应对敏捷转型中的团队阻力
应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中,明确沟通敏捷转型目的尤为关键,团队成员只有清晰理解转型背后的原因和利益,才能降低对变化的…...
Docker拉取MySQL后数据库连接失败的解决方案
在使用Docker部署MySQL时,拉取并启动容器后,有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致,包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因,并提供解决方案。 一、确认MySQL容器的运行状态 …...
机器学习的数学基础:线性模型
线性模型 线性模型的基本形式为: f ( x ) ω T x b f\left(\boldsymbol{x}\right)\boldsymbol{\omega}^\text{T}\boldsymbol{x}b f(x)ωTxb 回归问题 利用最小二乘法,得到 ω \boldsymbol{\omega} ω和 b b b的参数估计$ \boldsymbol{\hat{\omega}}…...
