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.c
	gcc -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#查看当前栈帧局部变量的值

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

遥感影像目标检测:从CNN(Faster-RCNN)到Transformer(DETR)

我国高分辨率对地观测系统重大专项已全面启动,高空间、高光谱、高时间分辨率和宽地面覆盖于一体的全球天空地一体化立体对地观测网逐步形成,将成为保障国家安全的基础性和战略性资源。未来10年全球每天获取的观测数据将超过10PB,遥感大数据时…

大数据开发治理平台~DataWorks(核心功能汇总)

目录 数据集成 功能概述 使用限制 功能相关补充说明 数据开发 功能概述 数据建模 功能概述 核心技术与架构 数据分析 功能概述 数据治理 数据地图 功能概述 数据质量 功能概述 数据治理资产 功能概述 使用限制 数据服务 功能概述 数据集成 DataWorks的数据…

Mongodb数据管理

Mongodb数据管理 1.登录数据库,查看默认的库 [rootdb51~]# mongo> show databases; admin 0.000GB config 0.000GB local 0.000GB> use admin switched to db admin > show tables system.version > admin库:admin 是 MongoDB 的管理…

洛谷P8707 [蓝桥杯 2020 省 AB1] 走方格

#include <iostream> using namespace std; int f[31][31]; int main(){int n,m;scanf("%d%d",&n,&m);f[1][1]1;//边界&#xff1a;f(1,1)1for(int i1;i<n;i)for(int j1;j<m;j)if((i&1||j&1)&&(i!1||j!1))//i,j不均为偶数&#…

腿足机器人之七- 逆运动学

腿足机器人之七- 逆运动学 基本概念腿部运动的数学表示坐标系定义以及自由度说明正运动学模型 逆运动学求解几何解法数值迭代法雅可比矩阵法基础双足机器人步态规划中的雅可比法应用 工程挑战与解决方案实际应用中的工具和算法多解问题高自由度机器人&#xff08;如Atlas的28自…

【强化学习的数学原理】第10课-Actor-Critic方法-笔记

学习资料&#xff1a;bilibili 西湖大学赵世钰老师的【强化学习的数学原理】课程。链接&#xff1a;强化学习的数学原理 西湖大学 赵世钰 文章目录 一、最简单的Actor-Critic&#xff08;QAC&#xff09;二、Advantage Actor-Critic&#xff08;A2C&#xff09;三、重要性采样和…

vtkCamera类的Dolly函数作用及相机拉近拉远

录 1. 预备知识 1.1.相机焦点 2. vtkCamera类的Dolly函数作用 3. 附加说明 1. 预备知识 要理解vtkCamera类的Dolly函数作用,就必须先了解vtkCamera类表示的相机的各种属性。  VTK是用vtkCamera类来表示三维渲染场景中的相机。vtkCamera负责把三维场景投影到二维平面,如…

JavaScript中的函数基础知识

JavaScript中的函数基础知识 1.函数声明的三种方式1.1 函数声明语句1.2 函数表达式1.3 new Function 2.函数的返回值3.函数调用的几种方法4.函数参数4.1 函数内部的arguments对象&#xff08;是个伪数组&#xff09;4.2 获取形参的个数4.3 函数不存在重载4.4 参数传递(1) 基本数…

fpga助教面试题

第一题 module sfp_pwm( input wire clk, //clk is 200M input wire rst_n, input wire clk_10M_i, input wire PPS_i, output reg pwm ) reg [6:0] cunt ;always (posedge clk ) beginif(!rst_n)cunt<0;else if(cunt19) //200M是10M的20倍cunt<0;elsecunt<cunt1;…

调用openssl实现加解密算法

由于工作中涉及到加解密&#xff0c;包括Hash&#xff08;SHA256&#xff09;算法、HMAC_SHA256 算法、ECDH算法、ECC签名算法、AES/CBC 128算法一共涉及5类算法&#xff0c;笔者通过查询发现openssl库以上算法都支持&#xff0c;索性借助openssl库实现上述5类算法。笔者用的op…

RTSP协议讲解及漏洞挖掘

文章目录 前言一、RTSP协议简介二、RTSP协议常见应用场景包括三、攻击RTSP协议的好处四、RTSP多种认证模式五、工具使用下载地址六、RTSP协议漏洞挖掘手法 前言 实时流传输协议&#xff08;Real Time Streaming Protocol&#xff0c;RTSP&#xff09;&#xff0c;RFC2326&…

Mysql各操作系统安装全详情

" 至高无上的命运啊~ " MySQL是一个关系型数据库管理系统&#xff0c;由瑞典 MySQL AB 公司开发&#xff0c;属于 Oracle 旗下产品。MySQL是最流行的关系型数据库管理系统之一&#xff0c;在 WEB 应用方面&#xff0c;MySQL是最好的RDBMS (Relational Database Mana…

Elasticsearch7.1.1 配置密码和SSL证书

生成SSL证书 ./elasticsearch-certutil ca -out config/certs/elastic-certificates.p12 -pass 我这里没有设置ssl证书密码&#xff0c;如果需要设置密码&#xff0c;需要再配置给elasticsearch 在之前的步骤中&#xff0c;如果我们对elastic-certificates.p12 文件配置了密码…

EasyExcel 自定义头信息导出

需求&#xff1a;需要在导出 excel时&#xff0c;合并单元格自定义头信息(动态生成)&#xff0c;然后才是字段列表头即导出数据。 EasyExcel - 使用table去写入&#xff1a;https://easyexcel.opensource.alibaba.com/docs/current/quickstart/write#%E4%BD%BF%E7%94%A8table%E…

C++基础知识学习记录—模版和泛型编程

1、模板 概念&#xff1a; 模板可以让类或者函数支持一种通用类型&#xff0c;在编写时不指定固定的类型&#xff0c;在运行时才决定是什么类型&#xff0c;理论上讲可以支持任何类型&#xff0c;提高了代码的重用性。 模板可以让程序员专注于内部算法而忽略具体类型&#x…

Django 连接(sqlserver)数据库方法

文章目录 django 的SQL server适配器&#xff0c;例如django-pyodbc-azure 或 mssql-django1、django-pyodbc-azure2、mssql-django3、注意 Django只内置了几个 Database Backend&#xff08;mysql、oracle、sqllite3&#xff08;默认&#xff09;、postgresql_psycopg2&#x…

华为 eNSP:MSTP

一、MSTP是什么 MSTP是多业务传送平台&#xff08;Multi-Service Transport Platform&#xff09;的缩写&#xff0c;它是一种基于SDH&#xff08;同步数字体系&#xff09;技术的传输网络技术&#xff0c;用于同时实现TDM、ATM、以太网等多种业务的接入、处理和传送。 MSTP技…

Mac端homebrew安装配置

拷打了一下午o3-mini-high&#xff0c;不如这位博主的超强帖子&#xff0c;10分钟结束战斗 跟随该文章即可&#xff0c;2025/2/19亲测可行 mac 安装HomeBrew(100%成功)_mac安装homebrew-CSDN博客文章浏览阅读10w次&#xff0c;点赞258次&#xff0c;收藏837次。一直觉得自己写…

一台服务器将docker image打包去另一天服务器安装这个镜像

一台服务器将docker image打到去另一天服务器安装这个镜像 1. 打包2.另一台服务器执行 1. 打包 docker save -o nebula-graph-studio.tar harbor1.vm.example.lan/dockerio/vesoft/nebula-graph-studioxxx.tar 是打包好的文件 后面的是 docker image 2.另一台服务器执行 docke…

Web开发技术概述

Web开发技术涵盖了前端和后端开发&#xff0c;以及数据库技术。前端开发包括使用HTML、CSS、JavaScript等原生技术&#xff0c;以及jQuery、Bootstrap、AngularJS、React、Vue等框架。后端开发则涉及ASP.NET、PHP、Python Web&#xff08;Flask、Django&#xff09;、Java Web&…