Linux环境基础开发工具使用(gcc/g++与makefile)
1.Linux编译器-gcc/g++使用
1. 背景知识
接下来的操作,我以gcc为例,因为两者选项都是通用的,所以也就相当于间接学习了
1.预处理(进行宏替换)
2.编译(生成汇编)
3.汇编(生成机器可识别代码)
4.连接(生成可执行文件或库文件)
2. gcc如何完成
格式 :gcc [选项] 要编译的文件 [选项] [目标文件]
2.1预处理(进行宏替换)
预处理功能主要包括宏定义,文件包含,条件编译,去注释等。
预处理指令是以#号开头的代码行。
选项“-E”该选项的作用是:让 gcc 在预处理结束后停止编译过程。
选项“-o” 是指目标文件
“.i”文件为已经过预处理的C原始程序。

我们还可以通过ls来查看gcc中的头文件

2.2编译(生成汇编)
在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作
在检查无误后,gcc 把代码翻译成汇编语言。
用户可以使用“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。

2.3 汇编(生成机器可识别代码)
汇编阶段是把编译阶段生成的“.s”文件转成目标文件
在此可使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了


2.4连接(生成可执行文件或库文件)
在成功编译之后,就进入了链接阶段。

总结

这里说明一下为什么想要执行程序为什么要在执行文件前加./
简单解释:shell命令执行时的环境变量默认是 $PATH,即到 $PATH 下找命令该如何运行,shell常用的命令在 $PATH 都有,所以可以直接运行。用户新建的文件所在的路径不在 $PATH 下,故直接用文件名来运行是无法运行的,必须加./表示命令就在当前目录下,不要去 $PATH 中找,直接运行就行了。这里再次说明了./表示的是当前目录,而不是执行命令的意思。
3.库
众所周知,每种编程语言都有属于自己的库,比如我们C语言中的 stdio、string、stdlib 等等标准库

当我们程序在调用库函数时,就是在调用标准库中的函数,而这些标准库都在 /usr/include 这个目录中,这个文件就是 Linux 中的C语言动态库;

除了动态库外还有静态库
3.1动态库
动态库即通过动态链接的库,动态库又称共享库
因为动态库中的内容是被所有程序共享的,简言之动态库中的代码只需要存在1份,程序需要使用时,直接通过对应位置调用就行了
Linux 中默认使用动态链接的方式,我们可以通过指令 ldd 最终生成的文件 来查看最终生成文件的链接情况


libXXX.so 是动态链接的标志
其中 lib 是前缀
.so 是后缀
去掉前缀与后缀,就是最终调用的库
举例: libc.so 去掉前缀与后缀,最终为 c,可以看出文件最终调用的是C语言共享库,即动态链接
动态链接 主要依赖不同函数在库中的位置信息进行调用,只有一份代码库,比较节省空间
动态库不能缺失,一旦缺失影响的不止一个程序,影响的是所有有用到这个库的程序
3.2静态库
除了 动态库外,还有静态库
采用静态链接的方式;静态链接不同于动态链接共享的方式
如果程序调用静态库,会将自己所需要的代码拷贝至程序中
完成拷贝后,后续不需要再调用静态库
如果想采用 静态链接 链接的方式编译程序,需要在编译时加上 -static 选项,当然前提是得有静态库,没有的可以通过 yum install -y glibc-static 下载静态库
当然我们也可以通过 ldd 最终生成的文件査看是否为静态链接

静态库 命名为 libXXX.a
lib 是前缀
.a 是后缀
去掉前缀与后缀,就是最终调用的库
因为这种方式很占空间,所以Linux中默认使用动态链接的方式

3.3优劣对比

2.自动化构建工具-makefile
2.1背景
会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力
一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作
makefile带来的好处就是——“自动化编译”
一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令
比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。
可见,makefile都成为了一 种在工程方面的编译方法。
2.2makefile文件
make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。
要想使用 make 指令,就得先有 Makefile 文件,Makefile 文件中主要编写任务,而任务由依赖关系 + 依赖方法构成
1.依赖关系
比如源文件为 mycode.c,
编译后生成的文件为mycode.exe,那么两者间的依赖关系为 mycode.exe:mycode.c 这组依赖关系 我们可以写入Makefile 文件中
2.依赖方法
有了关系后,就要描述具体实现方法,比如上面那组依赖关系的依赖方法为 gcc mycode -o mycode.exe 将依赖方法也写入Makefile 文件中



2.3make指令
上面展示了如何编写 Makefile 文件并执行相关任务,使用了 makef指令
单纯输入 make 指令时,默认执行 Makefile 中的第一个任务,当任务成功执行后,不再继续执行后续任务(一个makefile 文件中,可以有多个任务)
由此可见,单纯的 make 指令只会执行第一个自动化任务

当我们编写好 Makefile 文件后,可以通过 make任务名调用任务
任务名就是依赖关系中的左侧名
也可以直接通过 make 调用第一个任务

make指令可以自动有序生成文件

2.3任务刷新策略
同一个方法如果成功执行过,在原文件最近修改时间没有发生变化时,无法再执行任务
这背后的原因是方法是否执行会先判断生成的目标文件是否为最新,如果为最新,就不再执任务


2.4.PHONY伪目标
.PHONY 是 Makefile 文件中的一个关键字,意为对某某对象生成伪目标,这样就能在不对源文件进行修改的情况下,重复执行任务了

注意:
像 clean: 这种半缺失依赖方法是合理的,毕竟清理这个任务也不需要任何对象,只需要单纯的执行删除(清理)指令就行了
2.5补充

3.添加用户白名单
权限,是一个让人又爱又恨的东西,它的安全性固然很重要,但有时候又太麻烦了,当我们普通用户想执行操作时,比如最基本的下载软件指令,需要请root
Linux 中就有 sudo 提权 这个概念,简单来说,就是暂时借助 root 的身份去完成某条指令
使用sudo的时候只需要输入自己用户的密码,无需输入root用户的密码
但是sudo指令的执行要进入root的白名单才可使用
添加用户白名单只需要先用root账户进入一个配置文件

注意:退出文件的时候要用:wq!
进行强制性保存退出
相关文章:
Linux环境基础开发工具使用(gcc/g++与makefile)
1.Linux编译器-gcc/g使用 1. 背景知识 接下来的操作,我以gcc为例,因为两者选项都是通用的,所以也就相当于间接学习了 1.预处理(进行宏替换) 2.编译(生成汇编) 3.汇编(生成机器可识别代码)…...
PointNet++改进策略 :模块改进 | EdgeConv | DGCNN, 动态图卷积在3d任务上应用
目录 介绍核心思想及其实现核心思想实现步骤 如何改进PointNet**局部几何结构的处理****动态图的引入****特征聚合的灵活性****全局和局部特征的结合** 论文题目:Dynamic Graph CNN for Learning on Point Clouds发布期刊:TOG作者单位:麻省理…...
FFmpeg源码:skip_bits、skip_bits1、show_bits函数分析
GetBitContext结构体和其相关的函数分析: FFmpeg中位操作相关的源码:GetBitContext结构体,init_get_bits函数、get_bits1函数和get_bits函数分析 FFmpeg源码:skip_bits、skip_bits1、show_bits函数分析 一、skip_bits函数 skip…...
加密
一、加密 加密运算需要两个输入:密钥和明文 解密运算也需要两个输入:密钥和密文 密文通常看起来都是晦涩难懂、毫无逻辑的,所以我们一般会通过传输或者存储密文来保护私密数据,当然,这建立在一个基础上,…...
Kibana:如何使用魔法公式创建具有影响力的可视化效果?(第 1 部分)
作者:来自 Elastic Vincent du Sordet 我们将看到 Kibana Lens 编辑器中的神奇数学公式如何帮助突出显示高值。 简介 在上一篇博文《作为非设计师设计直观的 Kibana 仪表板》中,我们强调了创建直观仪表板的重要性。它展示了简单的更改(分组…...
【C++】多态and多态原理
目录 一、多态的概念 二、多态的定义及实现 🌟多态的构成条件 🌟虚函数 🌟虚函数的重写 🌠小贴士: 🌟C11 override 和 final 🌟重载、重写(覆盖)、重定义…...
C# 实现二维数据数组导出到 Excel
目录 功能需求 范例运行环境 Excel DCOM 配置 设计实现 组件库引入 编辑 方法设计 生成二维数据数组 核心方法实现 调用示例 总结 功能需求 将数据库查询出来的数据导出并生成 Excel 文件,是项目中经常使用的一项功能。本文将介绍通过数据集生成二维…...
nlohmann::json中有中文时调用dump转string抛出异常的问题
问题描述 Winodows下C开发想使用一个json库,使用的nlohmann::json,但是遇到json中使用中文时,转成string,会抛出异常。 nlohmann::json contentJson;contentJson["chinese"] "哈哈哈";std::string test con…...
Unity中InputField一些属性的理解
先看代码: using UnityEngine; using UnityEngine.UI;public class TestInput : MonoBehaviour {[SerializeField]InputField inputField;void Start(){Debug.Log(inputField.text);Debug.Log(inputField.text.Length);Debug.Log(inputField.preferredWidth);Debug…...
【webpack4系列】webpack构建速度和体积优化策略(五)
文章目录 速度分析:使用 speed-measure-webpack-plugin体积分析:使用webpack-bundle-analyzer使用高版本的 webpack 和 Node.js多进程/多实例构建资源并行解析可选方案使用 HappyPack 解析资源使用 thread-loader 解析资源 多进程并行压缩代码方法一&…...
从零开始搭建 PHP
🛠️ 从零开始搭建 PHP 环境:详细教程 PHP(Hypertext Preprocessor)是最流行的后端脚本语言之一,广泛用于构建动态网站和 Web 应用程序。在开始 PHP 开发之前,首先需要搭建 PHP 运行环境。无论你使用的是 …...
【数据结构】8——图3,十字链表,邻接多重表
数据结构8——图3,十字链表,邻接多重表 文章目录 数据结构8——图3,十字链表,邻接多重表前言一、十字链表结构例子 复杂例子 二、邻接多重表(Adjacency Multilist)例子 前言 除了之前的邻接矩阵和邻接表 …...
eth-trunk 笔记
LACP:Link Aggregation Control protocol 链路聚合控制协议 将多条以太网物理链路捆绑在一起成为一条逻辑链路,从而实现增加链路带宽的目的。同时,这些捆绑在一起的链路通过相互间的动态备份,可以有效地提高链路的可靠性 一、配…...
通信工程学习:什么是接入网(AN)中的TF传送功能
接入网(AN)中的TF传送功能 在通信工程中,TF(Transfer Function)传送功能是指为接入网(AN)不同位置之间提供通道和传输介质,以实现数据的有效传输。以下是关于TF传送功能的详细解释&a…...
【JavaEE】IO基础知识及代码演示
目录 一、File 1.1 观察get系列特点差异 1.2 创建文件 1.3.1 delete()删除文件 1.3.2 deleteOnExit()删除文件 1.4 mkdir 与 mkdirs的区别 1.5 文件重命名 二、文件内容的读写----数据流 1.1 InputStream 1.1.1 使用 read() 读取文件 1.2 OutputStream 1.3 代码演示…...
安卓13系统导航方式分析以及安卓13修改默认方式为手势导航 android13修改导航方式
总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析4.代码修改5.彩蛋1.前言 系统导航方式默认一般是按键的,如果要改成手势的话,我们来看看用户怎么修改的: 设置=>系统=>手势=>系统导航,在这里进行修改。我们来分析下这个流程,并且将其修改为…...
[技术杂谈]暗影精灵8plus电竞版台式机安装和使用注意
最近买回二手台式机准备做深度学习训练模型使用。由于个人不是十分有钱,因此下血本入手一台,不然深度学习玩不转。配置:i9-12900K / 64G d4 3733频率 / 1TSSD2TB机械 / RTX3090 24G显卡 旗舰版 机箱45L超大机箱。买回来后整体不错&#…...
【加密算法基础——AES解密实践】
AES 解密实践 AES 解密是对使用 AES 加密算法加密的数据进行恢复的过程。 常用的解密方式有三种: 在线解密工具:格式比较好控制,但是有些在线工具兼容性不好,有时候无法解出,不知道是自己的密文密钥没找对࿰…...
Spring01
spring框架 spring是轻量级的容器框架 spring framework 1、Spring核心学习内容 IOC、AOp, jdbcTemplate,声明式事务 2、IOC:控制反转,孚以管理部8号对象 3.AOP:切面编程4.JDBCTemplate:是spring提供一套访问数据库的技术,应用性强,相对好理解5.声明式…...
gogps 利用广播星历解算卫星位置matlab函数satellite_orbits详细注解版
主要注释了广播星历计算GPS BDS卫星位置的。 function [satp, satv] satellite_orbits(t, Eph, sat, sbas)% SYNTAX: % [satp, satv] satellite_orbits(t, Eph, sat, sbas); % % INPUT: % t clock-corrected GPS time % Eph ephemeris matrix % sat satellite…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
电脑桌面太单调,用Python写一个桌面小宠物应用。
下面是一个使用Python创建的简单桌面小宠物应用。这个小宠物会在桌面上游荡,可以响应鼠标点击,并且有简单的动画效果。 import tkinter as tk import random import time from PIL import Image, ImageTk import os import sysclass DesktopPet:def __i…...
Django RBAC项目后端实战 - 03 DRF权限控制实现
项目背景 在上一篇文章中,我们完成了JWT认证系统的集成。本篇文章将实现基于Redis的RBAC权限控制系统,为系统提供细粒度的权限控制。 开发目标 实现基于Redis的权限缓存机制开发DRF权限控制类实现权限管理API配置权限白名单 前置配置 在开始开发权限…...
