Linux环境开发工具

Linux软件包管理器yum

Linux下安装软件方式:

  1. 源代码安装
  2. rpm安装——Linux安装包
  3. yum安装——解决安装源、安装版本、安装依赖的问题

yum对应于Windows系统下的应用商店
使用Linux系统的人:大部分是职业程序员

客户端怎么知道去哪里下载软件?
Linux生态:

  1. 开源(一种商业战略)
  2. 开源不等于免费

选操作系统的标准:生态好(使用者的角度)

站在OS的设计者和推动者,他们应该做什么?

提供云服务器和软件服务

安装rzsz

Windows和Linux下消息互传

yum list |grep lrzsz
yum install lrzsz.x86_64
yum remove -y lrzsz.x86_64#-y:是否询问

yum怎么知道去哪里下载?

yum内置下载链接

yum install -y epel-release#扩展yum源

Linux编辑器-vim使用

vim:文本编写——写代码(多模式编辑器)

命令模式(默认模式):用户所有的输入都会被当作命令,一般不会作为文本输入

在这里插入图片描述

命令模式下光标定位

gg:定位光标到最开始行

G:定位光标到最结尾行

n+G:定位光标到第n行

(n)yy:复制光标所在行(后n行)

(n)p:粘贴(n重复行)到光标所在下一行

(n)dd:剪切、删除(n行)

u:撤销命令

ctrl+r:撤销之前的撤销

$:定位光标到当前行结尾

^:定位光标到当前行开始

w、b:光标按照单词进行行内、跨行移动

h、j、k、l:光标按左、下、上、右移动

~:对光标所在字符进行大小写转换

(n)r:对光标及其之后共n个字符替换为新的字符(需输入)

R:替换模式,对光标所在内容进行重新输入

(n)x:对光标及其之后的字符进行删除,共删除n位

底行模式下命令

多文件如何处理?

vs+文件名:打开另一个文件编辑窗口

ctrl+ww:窗口光标切换

光标在哪一个窗口里面,就对哪一个窗口进行操作。

w!:强制保存

q!:强制退出

set nu:调出行号

set nonu:去掉行号

vim的简单配置

touch .vimrc
vim .vimrc
#一个用户一个vim配置文件,不会互相影响,不建议给root做配置

给普通用户添加白名单

sudo#新建的普通用户无法sudo,必须添加到白名单
#在root下操作
ll /etc/sudoers
#在/etc/sudoers中root    ALL=(ALL)       ALL下方添加
#用户名    ALL=(ALL)       ALL

在这里插入图片描述

Linux编译器-gcc/g++使用

gcc mycode.c#用来编译C语言
g++ mycode.cpp#用来编译CPP

背景知识

为什么在windows或Linux上能编译运行对应的源文件?

需要在系统中提前安装C/C++开发相关的头文件、库文件

C/C++开发环境不仅仅指的是vs、gcc、g++,更重要的是语言本身的头文件和库文件。

安装vs,要选择对应的开发包,同步也在下载对应的头文件和库文件

编译型语言安装开发包一定需要下载对应的头文件和库文件

ls /usr/include/#linux下头文件和库文件所在位置

程序运行过程

  1. 预处理
gcc -E mycode.c -o mycode.i#生成.i文件
  • 去注释
  • 头文件展开
  • 条件编译
#ifndef
#else
#endif
  • 宏替换

条件编译的应用场景:

提供社区版和专业版的软件公司,需要维护两份代码吗?

不需要!根据不同的编译条件,在专业版裁减掉社区版不需要的功能即可。

  1. 编译(生成汇编)
gcc -S mycode.c -o mycode.s#生成.s文件
  1. 汇编(生成机器可识别代码)
gcc -c mycode.s -o mycode.o#生成mycode.o文件
od mycode.o#查看二进制文件内容
#mycode.o:可重定位目标二进制文件,简称目标文件,windows下的obj文件,不可以独立执行,需要经过链接后才能执行
  1. 链接(生成可执行文件或库文件)
gcc mycode.o -o mytest#直接生成可执行文件mytest
#将可重定位目标二进制文件和库文件进行链接才能形成可执行程序

动态库&&静态库

Linux下:.so(动态库)、.a(静态库)

Windows下:.dll(动态库)、.lib(静态库)

库有自己的命名规则:libname.so.XXX

机器默认值只会安装动态库

库其实就是把愿望呢间经过一定的翻译,然后打包——只给你提供一个文件即可,不用给你提供太多的源文件,也可以达到隐藏源文件的目的。

头文件提供方法的声明+库文件提供方法的实现+你的代码=你的软件

库的价值:不让我们做重复动作

我们的.o和库是如何链接的?

动态链接

动态库(共享库)

动态库不能缺失,一旦对应的动态库缺失,影响的不止一个程序,可能导致很多程序都无法正常运行。

ldd mytest#查看可执行程序依赖的动态库

静态链接

在编译器使用静态库进行静态链接的时候,会将自己的方法拷贝到目标程序中,该程序以后不会再依赖静态库

gcc mycode.c -o mytest
ldd mytest
#在Linux中,编译形成可执行程序,默认采用的就是动态链接,提供动态库
gcc mycode.c -o mytest -static#静态链接(体积变大)
#在Linux中,如果要采用静态链接的方式形成可执行程序,需要添加-static选项

centos yum安装C/C++静态库

sudo yum install -y glibc-static
sudo yum install -y libstdc++-static
  1. 如果没有静态库,能否执行-static?

不能

  1. 如果没有动态库,但是有静态库,而且gcc能找到?

gcc mycode.c -o mytest也可以运行,gcc默认优先动态链接

-static的本质:改变链接优先级

  1. 可执行程序不一定全是动态链接或者静态链接,可能都包括。

  2. 如果加-static,所有的链接要求都需要是静态链接

动静态链接的优缺点

动态库:

优点:动态库是共享库,可以有效的节省资源(磁盘空间、内存空间、网络空间)

缺点:动态库一旦缺失,会导致各个程序无法运行

静态库:

优点:静态库不依赖库,程序可以独立运行

缺点:体积大,比较消耗资源

Linux项目自动化构建工具-make/Makefile

make是一条指令

Makefile是当前目录下的一个文件

mycode: mycode.c#依赖关系gcc -o mytest mycode.c#依赖方法clean:rm -f mycode
  1. 依赖关系+依赖方法

make会自动推导Makefile中的依赖关系(栈式结构)

  1. 为什么只能make一次?

没有必要多次make,提高我们的编译效率

怎么做到的?

比较源文件和可执行程序的Modify(最近修改)时间

源文件形成可执行文件。

先有源文件,才有可执行。一般而言,源文件的Modify时间要比可执行的Modify时间早

如果我们更改了源文件,历史上还有可执行,那么源文件的Modify一定比可执行晚。

stat mytest#查看mytest的文件时间
#Access:文件被访问
#Change:文件属性被修改
#Modify:文件内容被修改
touch mytest#mytest已存在,把mytest的所有时间更新成最新的

make会根据源文件和可执行的新旧,判断是否需要重新执行依赖关系进行编译!

mycode: mycode.cgcc -o $@ $^
#$@:目标文件
#$^:源文件.PHONY:clean#伪目标,总是被执行
clean:rm -f mycode

使用git命令行

什么是git?

具有网络功能的版本控制器(开源)

client和server是一体的

本地仓库+远端仓库

git如何使用?

yum install git
git clone 链接
git add mycode
git commit -m "自己的练习代码"
git push

git的其他问题

git log#提交日志
git status#提交状态
#.gitignore

Linux调试器-gdb使用

debug&&release

debug可以被追踪、调试,形成可执行程序的时候会有调试信息

gcc默认编译是release方式发布的,不能直接调试

如果要以debug方式发布,必须携带-g选项

gcc -o mytest mycode.c -g

要被gdb调试,必须以debug方式发布

gdb命令

gdb mycode.c#开始调试mycode.c
q#退出调试,退出后上次调试信息会自动被清理掉
l 行号#显示源代码,每次列10行(行号所在位置在中间)
l 函数名#列出某个函数的源代码。
r#运行程序
b 行号#在行号打断点
info b#查看断点信息
d 断点编号#删除对应的断点信息
b 文件:行号#在对应文件行号打断点
n#逐过程
s#逐语句
p 变量#查看变量的信息
display 变量#常显示变量的信息
undisplay 编号#取消编号对应的常显示
until 行号#调试转到对应的行、快速跳过函数代码快
finish#结束当前函数的调试
c#跳到下一个断点
disable 断点编号#禁用断点
undisable 断点编号#启用断点
set 变量#设置变量的值
bt#查看各级函数调用及参数
info locals#查看当前栈帧局部变量的值

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/895871.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自动化办公|通过xlwings进行excel格式设置

1. 介绍 xlwings 是一个强大的 Python 库,可以用来操作 Excel,包括设置单元格格式、调整行高列宽、应用条件格式以及使用内置样式。本文将详细介绍如何使用 xlwings 进行 Excel 格式化操作,并附带代码示例。 2. 基础格式设置(字…

EasyRTC:智能硬件适配,实现多端音视频互动新突破

一、智能硬件全面支持,轻松跨越平台障碍 EasyRTC 采用前沿的智能硬件适配技术,无缝对接 Windows、macOS、Linux、Android、iOS 等主流操作系统,并全面拥抱 WebRTC 标准。这一特性确保了“一次开发,多端运行”的便捷性&#xff0c…

【架构思维基础:如何科学定义问题】

架构思维基础:如何科学定义问题 一、问题本质认知 1.1 问题矛盾 根据毛泽东《矛盾论》,问题本质是系统内部要素间既对立又统一的关系。例如: 电商系统矛盾演变: 90年代:商品供给不足 vs 消费需求增长00年代&#x…

从零开始构建一个小型字符级语言模型的详细教程(基于Transformer架构)之一数据准备

最近特别火的DeepSeek,是一个大语言模型,那一个模型是如何构建起来的呢?DeepSeek基于Transformer架构,接下来我们也从零开始构建一个基于Transformer架构的小型语言模型,并说明构建的详细步骤及内部组件说明。我们以构建一个字符级语言模型(Char-Level LM)为例,目标是通…

Effective Go-新手学习Go需要了解的知识

不知不觉从事Golang开发已有4+年了,回顾自己的成长经历,有很多感悟和心得。如果有人问我,学习Golang从什么资料开始,我一定给他推荐"Effective Go"。《Effective Go》是 Go 语言官方推荐的编程风格和最佳实践指南,其结构清晰,内容涵盖 Go 的核心设计哲学和常见…

坐井说天阔---DeepSeek-R1

前言 DeepSeek-R1这么火,虽然网上很多介绍和解读,但听人家的总不如自己去看看原论文。于是花了大概一周的时间,下班后有进入了研究生的状态---读论文。 DeepSeek这次的目标是探索在没有任何监督数据的情况下训练具有推理能力的大模型&#…

MySQL(1)基础篇

执行一条 select 语句,期间发生了什么? | 小林coding 目录 1、连接MySQL服务器 2、查询缓存 3、解析SQL语句 4、执行SQL语句 5、MySQL一行记录的存储结构 Server 层负责建立连接、分析和执行 SQL存储引擎层负责数据的存储和提取。支持InnoDB、MyIS…

IntelliJ IDEA 接入 AI 编程助手(Copilot、DeepSeek、GPT-4o Mini)

IntelliJ IDEA 接入 AI 编程助手(Copilot、DeepSeek、GPT-4o Mini) 📊 引言 近年来,AI 编程助手已成为开发者的高效工具,它们可以加速代码编写、优化代码结构,并提供智能提示。本文介绍如何在 IntelliJ I…

2025.2.20总结

今晚评测试报告,评到一半,由于看板数据没有分析完,最后让我搞完再评. 尽管工作了多年的同事告诉我,活没干完,差距比较大,没资格评报告,但还是本着试试的态度,结果没想到评审如此严苛…

ok113i——交叉编译音视频动态库

提示:buildroot支持ffmpeg和SDL,但博主的ffmpeg是按下面方法编译通过,SDL使用buildroot直接编译也通过; 1. 下载ffmpeg源码 下载链接:https://github.com/FFmpeg/FFmpeg/tags 根据版本需要自行下载压缩包&#xff0c…

什么叫不可变数据结构?

不可变数据结构(Immutable Data Structures)是指一旦创建之后,其内容就不能被修改的数据结构。这意味着任何对不可变数据结构的“修改”操作实际上都会返回一个新的数据结构,而原始数据结构保持不变。 一、不可变数据结构的核心特点 不可变性:一旦创建后,数据结构的内容…

深度学习之图像分类(一)

前言 图像回归主要是对全连接进行理解 而图像分类任务主要是对卷积的过程进行理解 这一部分会介绍一些基础的概念 卷积的过程(包括单通道和多通道) 理解一个卷积神经网络工作的过程 以及常见的模型的类别和创新点 图像分类是什么 定义 图像分类是指将输…

AutoDock CrankPep or ADCP进行蛋白质多肽对接

需求描述 使用AutoDock CrankPep or ADCP进行蛋白质多肽对接 硬件及系统配置 自用电脑型号如下: 电脑:Precision Tower 7810 (Dell Inc.) CPU : Intel Xeon CPU E5-2686 v4 2.30GHz GPU: NVIDIA GeForce GTX 1070 Linux版本&a…

Django 5实用指南(二)项目结构与管理

2.1 Django5项目结构概述 当你创建一个新的 Django 项目时,Django 会自动生成一个默认的项目结构。这个结构是根据 Django 的最佳实践来设计的,以便开发者能够清晰地管理和维护项目中的各种组件。理解并管理好这些文件和目录结构是 Django 开发的基础。…

LabVIEW利用CANopen的Batch SDO写入

本示例展示了如何通过CANopen协议向设备写入Batch SDO(批量服务数据对象)。Batch SDO允许用户在一次操作中配置多个参数,适用于设备的批量配置和参数设置。此方法能够简化多个参数的写入过程,提高设备管理效率。 主要步骤&#xf…

WPF9-数据绑定进阶

目录 1. 定义2. 背景3. Binding源3.1. 使用Data Context作为Binding的源3.2. 使用LINQ检索结果作为Binding的源 4. Binding对数据的转换和校验4.1. 需求4.2. 实现步骤4.3. 值转换和校验的好处4.3.1. 数据转换的好处 4.4. 数据校验的好处4.5. 原理4.5.1. 值转换器原理4.5.2. 数据…

大数据治理:数字时代的关键密码

大数据治理:数字时代的关键密码 在信息技术飞速发展的今天,数字化浪潮席卷全球,深刻地改变着我们的生活和工作方式。数据,作为数字化时代的核心资产,正以前所未有的速度增长和积累。据国际数据公司(IDC&am…

LeetCode 1299.将每个元素替换为右侧最大元素:倒序遍历,维护最大值,原地修改

【LetMeFly】1299.将每个元素替换为右侧最大元素:倒序遍历,维护最大值,原地修改 力扣题目链接:https://leetcode.cn/problems/replace-elements-with-greatest-element-on-right-side/ 给你一个数组 arr ,请你将每个…

机器学习面试题汇总

1. 基础知识 什么是监督学习和无监督学习? 监督学习是基于已标注的训练数据来学习预测模型;无监督学习则是在没有标签的数据上进行学习,寻找数据的结构或模式。什么是过拟合和欠拟合? 过拟合是指模型在训练数据上表现很好,但在测试数据上表现差。欠拟合是指模型在训练数据…

【SQL教程|07】sql中条件查询where用法示例

SQL WHERE 条件查询教程 在SQL中,WHERE 条件用于在 SELECT 语句后过滤结果集,只返回符合条件的记录。它帮助我们从大量数据中提取所需的信息。以下是使用 WHERE 条件的逐步指南。 1. 基本语法 SELECT [字段] FROM [表] WHERE [条件];SELECT&#xff1a…