【LInux】基础开发工具的使用

2023-11-16

文章目录

一. Linux的应用市场 — yum

1. 什么是yum?

人们把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安
装程序)放在一个服务器上, 通过包管理器可以很方便的获取到这个编译好的软件包, 直接进行安装。软件包和软件包管理器, 就好比 “App” 和 “应用商店” 这样的关系。

yum(Yellow dog Updater, Modified)是Linux下非常常用的一种包管理器.,相当于Linux的应用市场,主要应用在Fedora, RedHat,Centos等发行版上。

2. 为什么要有yum?

给开发者提供一个安全、高效的软件安装环境。

3. 如何使用yum?

3.1 前提条件

关于 yum 的所有操作必须保证主机(虚拟机)处于联网状态。就行我们在手机上下载软件,需要连WIFE或开流量一样。

我们可以通过ping指令来验证我们的机器是否处于联网状态,具体的操作就是ping + 网址,如果一直有刷新time = xxxms说明已经处于联网状态。
在这里插入图片描述

3.2 搜索软件

就好比我们在手机的应用市场里搜索我们想要下载的App一样
在这里插入图片描述
在Linux中,我们也可以通过yum list | grep | 软件包关键字这个指令来搜索yum里包含该关键字的软件包。

比如我们要下载一个软件叫 lrzsz ,可以在linux中可以代替ftp的上传和下载。
在这里插入图片描述
几点说明:

  • “x86_64” 后缀表示64位系统的安装包,选择包时要和系统匹配
  • “el7” 表示操作系统发行版的版本. “el7” 表示的是 centos7/redhat7. “el6” 表示 centos6/redhat6
  • 最后一列, os 表示的是 “软件源” 的名称, 类似于 “小米应用商店”, “App Store” 这样的概念。

3.3 安装软件

通过前面的搜索我们可以得到想要下载的软件包的名称,复制软件包的名称,然后我们可以输入yum install 软件包名称指令来完成软件的安装
在这里插入图片描述

最后出现 “complete” 字样, 说明安装完成。

几点说明:

  • 安装软件时由于需要向系统目录中写入内容, 一般需要 sudo 或者切到 root 账户下才能完成,安装后的软件所以用户都可以使用。
  • yum安装软件只能一个装完了再装另一个. 正在yum安装一个软件的过程中, 如果再尝试用yum安装另外一个软件, yum会报错。

3.4 卸载软件

直接输入指令yum remove 软件包名称,当然也需要 sudo 或者切到 root 账户下才能完成。
在这里插入图片描述

二. Linux的文本编辑器 — vim

1. 什么是vim?

vi(visual editor)编辑器通常被简称为vi,它是Linux和Unix系统上最基本的文本编辑器,类似于Windows 系统下的notepad(记事本)编辑器。

vim(vi improved)是vi编辑器的加强版,它不仅兼容vi的所有指令,而且还有一些新的特性在里面,例如语法加亮、自动缩进等。

2. 为什么要学习vim?

  1. 很强大的编辑功能,不逊色于任何最新的文本编辑器。
  2. vi编辑器是所有Unix及Linux系统下标准的编辑器,所有的Unix Like系统都会内建vi文本编辑器,其他的文本编辑器则不一定会存在
  3. 一些软件的编辑接口会主动调用vi (例如 crontab, visudo, edquota 等命令)

3. 如何使用vim?

3.1 启用vim

指令:
vim 文件名,进入后默认光标是在上一次退出编辑时的位置

vim 文件名 + n,进入后光标位置在第n行

3.2 退出vim

命令模式下退出

在命令模式中,连按两次大写字母Z,若当前编辑的文件曾被修改过,则vim保存该文件后退出,返回到shell;若当前编辑的文件没被修改过,则vim直接退出, 返回到shell。

底行模式下退出

:w 保存但不退出

:q 退出但不保存

:wq 保存且退出

:!wq 强制保存且退出

3.3 简单配置vim

原生的vim界面是比较简陋的,不仅如此编程的体验也很不好,没有换行后自动缩进、tab距离太短、没有自动补齐等问题,这些都可以通过配置自己来解决。
在这里插入图片描述

配置文件的位置

  • 在目录 /etc/ 下面,有个名为vimrc的文件,这是系统中公共的vim配置文件对所有用户都有效
  • 而在每个用户的主工作目录下,都可以自己建立私有的配置文件,命名为:“.vimrc”,这个文件通常不存在,需要我们自己建立。注意这里的配置只针对当前用户有效

配置操作

下面我们简单讲解一下只针对当前用户有效的vim的配置方法

第一步:
在当前用户的主工作目录下创建".vimrc"这个文件,如果有的话就不用创建了。

终端操作:
$ cd ~ //回到主工作目录
$ touch .vimrc //创建文件

第二步:
进入 .vimrc 文件,写入我们需要的配置选项。常见配置选项比如下面几个:

  • 显示行号: set nu
  • 设置语法高亮: syntax on
  • 设置缩进的空格数为4: set shiftwidth=4

终端操作:
$ vim .vimrc //进入文件
在这里插入图片描述
保存并退出,再次进入这个文件我们发现确实配置成功了
在这里插入图片描述

3.4 vim常见的几种模式

主要介绍几种常见的模式:正常模式、插入模式、命令模式、视图模式

3.4.1 正常模式

正常模式是vim打开文件后默认进入的模式,无论在哪种模式下,按下Esc键就会进入正常模式。如果我们在使用其他各种模式时出现混乱,无脑Esc进入正常模式就行。
在这里插入图片描述

正常模式的作用

正常模式不能编辑文本。它一般用于浏览文件,也包括一些复制、粘贴、删除等操作。这时击键时,一般的键/键组合会被当成功能键,而不会键入对应的字符。

在这个模式下,我们可能通过键盘在文本中跳来跳去,跳动的范围从小到大是字符、单词、行、句子、段落和屏幕。

正常模式下管理文本的常用快捷键

shift + $:定位到当前行的最后一个字符位置

shift + ^:定位到当前行的第一个字符的位置

gg:定位到代码第一行位置

shift + g:定位到代码最后一行的位置

u / ctrl+r:撤销 / 反撤销

yy / p:复制一行 / 粘贴一行

n+yy / n+p:复制n行 / 粘贴n行

dd / n+dd:删除一行 / 删除n行

shift + ~:从光标位置开始逐个字符地从左往右进行大小写切换

w / b:以“单词”为单位进行光标的跳转

ctrl + b:文本向上移动一页

ctrl + f:文本向下移动一页

ctrl + u:文本向上移动半页

ctrl + d:文本向下移动半页

3.4.2 插入模式

在正常模式下按下a、i、o 键,进入插入模式,插入模式里可以进行文字的输入,在该模式下按Esc键可以切换回正常模式。

当我们处于正常模式时,按下:

  • a :在光标的下一个位置进入插入模式
  • i :在光标当前位置进入插入模式
  • o :往下开辟一空行进入插入模式

在这里插入图片描述

插入模式的作用

插入模式中,击键时会写入相应的字符。

插入模式下快速编辑

插入模式没有快捷键,需要配合命令模式下的那些快捷键进行文本编辑,可以达到快速编辑的作用。

3.4.3 底行/命令模式

在正常模式下输入“:”进入命令模式
在命令模式中按Esc进入正常模式
在这里插入图片描述

命令模式的作用

在命令模式中可以执行一些输入并执行一些vim或插件提供的指令,就像在shell里一样。这些指令包括设置环境、文件操作、调用某个功能等等。

命令模式的下的常用快捷键

set mouse=a / mouse-=a:打开鼠标 / 关闭鼠标

set nu / nonu:设置行号 / 取消行号

w:保存

q:退出

wq:保存并退出

! + wq:强制保存并退出

vs + 文件名:多文件分屏编辑(补充:在正常模式下按ctrl + ww可以进行文件切换)

↑ / ↓:搜索历史命令

3.4.4 视图模式

在正常模式按下ctrl+v,即可以进入视图模式。在视图模式中我们可以选中一块区域进行操作包括:删除、注释、缩进等。

在这里插入图片描述

视图模式下各功能的具体操作方法

注意在视图模式里,只能通过h(左)、j(下)、k(上)、l(右)来移动光标。

功能一:批量注释

  • 在正常模式里先把光标移动到要注释的起始地方,然后ctrl + v进入视图模式。
  • 接下来通过h、j、k、l 来选中所有要注释的行。
  • 接着我们按shift + i(即大写字母的i)进入插入模式之后,输入我们的注释符’#‘或者’//’,接着迅速按下Esc键即可完成批量注释,并回到正常模式。

功能二:删除批量注释

  • 正常模式下按ctrl + v进入视图模式
  • 接着我们一样通过h、j、k、l 选择我们刚刚插入的注释符 ‘//’,注意我们必须将两列注释符全部选择到。
  • 接着按d直接删除并回到正常模式

功能三:批量缩进(即批量tab)

  • 在正常模式里先把光标移动到要批量缩进行的开始的地方,然后ctrl + v进入视图模式。
  • 接下来通过h、j、k、l 来选中要缩进的行。
  • shift+ i 进入插入模式后,按tab建然后迅速按Esc完成批量缩进并回到正常模式

功能四:批量反缩进(即shift + tab)

  • 按住ctrl + v 进入可视块模式
  • 通过h、j、k、l 来批量选择我们要删除的空格
  • 最后按d直接删除,并回到正常模式
3.4.5 各个模式的相互切换

正常模式是其他模式的中转站,其他模式只需按Esc就可以进入正常模式,再经由正常模式转到其他模式,如下图所示:
在这里插入图片描述

三. Linux的编译器 — gcc / g++

这里我们看看gcc如何把一个hello.c的源程序最终编译成一个可执行程序hello的。
在这里插入图片描述

1. 预处理

$ gcc -o hello.i -E hello.c

在这里插入图片描述

  • 预处理阶段主要完成:头文件展开、宏替换、条件编译和去掉注释
  • 选项“-o”后面跟的是经过预处理后生成的目标文件,里面存有预处理后的信息。
  • 选项“-E”作用是仅让gcc完成预处理的过程,后面跟的是依赖文件
  • 如果不写明生成的目标文件(即 -o hello.i ),那么“-E”选项执行的预处理操作就会把源程序经过预处理后得到的信息输出到显示器上;如果写明目标文件,就会把这些信息存储到指定的目标文件当中。
    在这里插入图片描述

2. 编译

$ gcc -o hello.s -S hello.i

在这里插入图片描述

  • 编译主要完成:检查语法错误和生成汇编代码
  • 选项“-E”完成编译的过程,如果依赖文件是还未被预处理的源文件,那么会先完成预处理再完成编译,如果已经完成了预处理,就直接进行编译。
  • 如果不写明生成的目标文件,会默认生成同名且后缀为.s的目标文件,里面写有该程序的汇编代码。
    在这里插入图片描述

3. 汇编

$ g++ -o hello.c -c hello.s

在这里插入图片描述

  • 汇编主要完成:把汇编代码转化成二进制机器码
  • 选项“-c”完成汇编的过程,如果依赖文件还未完成预处理或编译,会先完成前面的最后完成汇编。
  • 如果不写明生成的目标文件,会默认生成同名且后缀为.o的目标文件,里面写有该程序的二进制机器码。
    在这里插入图片描述

4. 连接

$ gcc hello.o
  • 连接生成最终的可执行程序
  • 不用加任何选项就是直接完成从预处理到最后的连接过程
  • 如果是多文件编译,在连接这步时要把需要连接的文件都一起写在后面,中间用空格隔开。
  • 如果不写明目标文件,默认生成一个叫做a.out的可执行程序
    在这里插入图片描述

5. 动态库和静态库

5.1 什么是库?

库是写好的现有的,成熟的,可以复用的代码。又因为连接的方式不同分为静态库和动态库。

5.2 静态库

什么是静态库?

在链接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中,这种连接方式叫做静态连接,被打包的库叫静态库。

静态库的优缺点

优点
编译连接成功的可执行文件可以独立运行,而不再需要向外部要求读取函数库的内容。

缺点

  • 可执行程序的文件较大
  • 库更新时,需要重新编译链接

5.2 动态库

什么是动态库?

链接成功后的可执行程序会保留一个指向库的位置,在程序运行时才会去读取库函数来使用。这种连接库的方式叫做动态链接,被连接的库叫做动态库。

动态库的优缺点

优点

  • 可执行程序的文件小,规避了空间浪费问题
  • 实时连接最新的库

缺点
可执行文件无法单独运行,必须保证能够连接到动态库。

5.3 Linux下的连接方式

gcc / g++默认可执行程序,默认是动态链接的。如果想要静态连接,需要我们在连接时手动加上选项 -static

我们有两种方法证明gcc / g++默认生成的可执行程序是动态链接的,在此之前我们先创建几个文件,看下面例子:

我们有个叫做mytest.c的文件
在这里插入图片描述
通过gcc编译连接mytest.c生成可执行程序mytest,注意我们没有加任何其他选项,mytest这个可执行程序是gcc默认情况下生成的。
在这里插入图片描述
接着我们在通过 -static 选项编译链接mytest.c,生成一个静态连接的可执行程序mytest_s
在这里插入图片描述
先阶段我们可以直接地看到:静态连接生成的mytest_s的文件大小是mytest的100倍多一点。可以推测默认编译连接形成的mytest很可能是动态链接的。

我们可以通过两条指令file和ldd来具体的查看它们的连接方式和库。

指令一file + 可执行程序名称
file指令用来识别文件类型,也可用来辨别一些文件的编码格式。

通过file目录指令分别查看这两个可执行程序,明确写着mytest是动态链接的,mytest_s是静态链接的。
在这里插入图片描述
指令二ldd + 可执行程序名称
ldd是list, dynamic, dependencies的缩写, 意思是, 列出动态库依赖关系,这也就是该指令的作用。

补充几点:Linux中动态库的扩展名通常为 libxxx.a ,而静态库的为 libxxx.so 差别就是后缀不同,动态库后缀为 .so ,静态库后缀为 .a

回到我们的例子我们只想 ldd + mytest,结果我们可以找到它动态库的名称是 c ,即mytest是动态链接的。
在这里插入图片描述
看看静态链接生成的mytest_s,执行 ldd mytest_s
在这里插入图片描述
结果告诉我们他不是动态链接的可执行程序。综上我们可以得到最终的结论,gcc / g++默认生成的可执行程序时动态链接的,想要静态链接,需要我们在连接时手动加入 -static 选项。

四. Linux的调试工具 — gdb

1. 检查调试信息

1.1 生成debug模式的程序

程序的发布方式有两种,debug模式和release模式,Linux中gcc / g++编译链接生成的二进制程序,默认是release模式,此时是没有调试信息的。要使用gdb调试,必须要有调试信息即debug模式,只需在编译的时候, 加上 -g 选项。

1.2 检查是否带有调试信息

方法一:直接对程序进行gdb调试

直接对该可执行程序进行调试,执行 gdb + 程序名称 开始调试,如果没有调试信息它会告诉你:(no debugging symbols found)。
在这里插入图片描述
如果有调试信息的话就不会出现括号里的话(no debugging symbols found)
在这里插入图片描述

方法二:通过readelf指令查看调试信息

readelf命令,一般用于查看ELF格式的文件信息,常见的文件如在Linux上的可执行文件、动态库(.so)、静态库(.a) 等包含ELF格式的文件。其中选项 -S作用是显示节头信息(如果有数据的话)。

指令:readelf -S 可执行程序名称 | grep debug

对于没有调试信息的可执行程序,不会打印出任何东西
在这里插入图片描述
如果有调试信息,它会筛选打印出来
在这里插入图片描述

2. 开始调试和退出调试

开始:gdb + 可执行程序名称

退出:quit 或 ctrl + d

3. 具体操作方法

gdb有记忆功能,什么都不用输入,按回车自动自行上一条指令,上下方向键可以查看之前输入过的指令。

l + 行号:列出代码,一次列10行

r:运行代码

b + 行号:在指定行上打断点

d + 断点编号:删除断点,不指定断点编号的话就是删除所有断点

info + b:查看所有断点信息

c:跳转到下一个断点

n:逐语句

s:逐过程

p + 变量名:查看变量的值

display + 变量名:踪查看一个变量,每次停下来都显示它的值

undisplay + 变量编号:取消对先前设置的那些变量的跟踪

until + 行号:跳转到任意行

finish:直接运行完当前所在的函数

五. Linux的项目自动化构建工具 — make/Makefile

1. 什么是make和Makefile?

Makefile是一个文件,里面写我们编译的指令。
make是一条命令,用来执行Makefile里的编译指令。

2. 为什么要有make和Makefile?

如果遇到更多的源文件需要编译和共同连接时,运行的话用gcc就要把所有的源文件的名字写在一起,其中一个写错了,检查起来会很麻烦。我们可以把编译的指令存到Makefile文件里统一管理,通过make来执行编译操作,达到一键编译运行效果,极大的提高了软件开发的效率。

2. Makefile的使用

比如我们这里来实现一个简单的进度条功能,创建三个文件:proc.h、main.c、proc.c和Makefile
在这里插入图片描述

Makefile

我们先写好Makefile文件的内容,确保各个文件都能顺利完成编译和最后的连接。

依赖关系
以冒号分隔,左边是目标文件,右边是生成目标文件所需要的依赖文件
在这里插入图片描述
依赖方法

  • 依赖方法是写在对应依赖关系下面的具体操作方法
  • 依赖方法必须以tab开头,不能通过空格一个个的打!
    在这里插入图片描述

执行的顺序

下面是我们进度条Makefileli的内容,整体是从上往下执行,先看依赖关系中的依赖文件是否存在,如果存在就执行对应的依赖方法;不存在的话就跳过依赖方法往下找生成依赖文件的依赖关系和依赖方法,生成前面指令想要的依赖文件,生成后再这回来执行指令。

PS:这里连接时可以不写明proc.h这个头文件,只要proc.c或main.c只要包含了它,系统就会自动到当前目录下找这个我们自己写的头文件来连接的。
在这里插入图片描述
这时我们只要输入命令make就可以完成整个进度条程序的编译工作了。可以看到这里的执行顺序:先执行编译指令,得到编译好的文件后执行连接指令。
在这里插入图片描述

伪目标完成项目的清理工作

我们还可以在Makefile中实现一个用来清理生成的目标文件和可执行程序的命令,以便对源程序代码修改后可以快速清理和重编译,一般我们把这种命令设置为伪目标,用 .PHONY 修饰

我们给目标文件取名为clean,不需要依赖文件,因为我们的主要目的是执行下面的依赖方法。像clean这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行,不过,我们可以显示要make执行。即命令——“make clean”,以此来清除所有的目标文件,以便重编译。
在这里插入图片描述

伪目标的特性.

伪目标的特性是总是被执行的,即随时都可以被执行,即使没有对应的文件。
在这里插入图片描述
而真目标执行一次后如果你再次执行,它会提示你这已经是最新的了。
在这里插入图片描述
那么我们最终整合伪目标后看看Makefile的文件内容:
在这里插入图片描述

Makefile中的宏定义

  • $():替换成括号里面的内容
  • $@ :依赖关系中的目标文件
  • $^ :依赖关系中的依赖文件列表
  • $< :分别取出依赖关系中的一个个依赖文件,执行相同的指令

宏替换可以使得程序更加灵活和简洁,把具体的文件名取别名替换,这样修改时只需要别名的内容就行。
在这里插入图片描述

具体进度条的实现

proc.h
包含需要的头文件和定义一个宏定义NUM表示进度条字符的数量
在这里插入图片描述
main.c
在main函数里调用proc()函数
在这里插入图片描述
proc.c
具体进度条的实现,用"#"模拟加载的过程,最右边是代表加载程度的百分比和一个循环转动的线条。

要注意的是printf函数是行缓冲函数,满足下面条件之一才会将缓冲区刷到对应的文件(一般是stdout即显示器)中。

  1. 缓冲区被填满
  2. 写入的字符中有’\n’或’\r’
  3. 调用fflush手动刷新
  4. 程序结束

观察我们下图的程序,printf本来要输出到显示器上的内容一直被存放在缓冲区里,不满足我们的连续加载效果的要求,所以我们要调用fflush手动刷新缓冲区。
在这里插入图片描述

每进入一次循环就刷新一次缓冲区,使得前面printf的内容输出到显示器
在这里插入图片描述

3. make的工作原理

make是如何工作的,在默认的方式下,也就是我们只输入make命令

  1. make会在当前目录下找名字叫“Makefile”的文件。
  2. 如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“proc”这个文件, 并把这个文件作为最终的目标文件。
  3. 如果proc文件不存在,或是proc所依赖的后面的 proc.o和main.o 文件的文件修改时间要比hello这个文件新(可以用 touch 测试),那么他就会执行后面所定义的命令来生成 proc.o和main.o 这个文件。
  4. 如果proc所依赖的 proc.o和main.o 文件不存在,那么make会在当前文件中找目标为 proc,o和main.o 文件的依赖性,如果找到则再根据那一个规则生成 proc,o和main.o 文件。
  5. 当然,你的 proc.c和main.c 文件是存在的,于是make会生成对应的 .o文件,然后再用 proc,o和main.o 文件执行make的终极任务,也就是生成可执行文件proc
  6. 这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。
  7. 在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错。
  8. make只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起,我就不工作啦。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【LInux】基础开发工具的使用 的相关文章

  • 如何从 Linux 的 shell 中删除所有以 ._ 开头的文件?

    确实如标题所示 我已将许多文件从 Mac 复制到 Raspberry Pi 这导致了许多以前缀开头的多余文件 我想删除以以下开头的文件夹中的每个文件 我该怎么做 尝试类似的方法 cd path to directory rm rf 或者 如
  • perf stat中的cycles注释是什么意思

    8 014196 task clock 0 004 CPUs utilized 204 context switches 0 025 M sec 32 cpu migrations 0 004 M sec 0 page faults 0 0
  • 是否从页面缓存中的脏页面进行文件读取?

    当字节写入文件时 内核不会立即将这些字节写入磁盘 而是将这些字节存储在页缓存中的脏页中 回写缓存 问题是 如果在脏页刷新到磁盘之前发出文件读取 则将从缓存中的脏页提供字节 还是首先将脏页刷新到磁盘 然后进行磁盘读取以提供字节 将它们存储在进
  • 如何确保 numpy BLAS 库可用作动态加载库?

    The theano安装文档 http www deeplearning net software theano install html troubleshooting make sure you have a blas library指
  • 如何从类似于 eclipse 的命令行创建可运行的 jar 文件

    我知道 eclipse 会生成一个可运行的 jar 文件 其中提取并包含在该 jar 文件中的所有库 jar 文件 从命令提示符手动创建 jar 文件时如何执行类似的操作 我需要将所有 lib jar 解压到类文件夹中吗 目前我正在使用 j
  • 为 Linux 安装 R 包时出错

    我试图在 R 3 3 上安装一个名为 rgeos 的包 但是当我输入 install packages rgeos 但它返回给我以下错误 其他包也会发生同样的情况 但不是所有包 gt installing source package rg
  • 如何从 Linux 命令行获取视频文件的分辨率(宽度和高度)?

    我一直在挖掘 mplayer mencoder 和 ffmpeg 文档 但我似乎无法想出anything 我对输出格式不是特别挑剔 因为我可以使用正则表达式将其拉出来 我只是似乎无法首先获取数据 Use ffprobe https ffmp
  • 如何从linux命令行运行.exe可执行文件? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我在 Windows 中有一个 abc exe 可执行文件 我可以使用 DOS 命令提示来执行此应用程序 并为其提供一些运行时变量 我想从
  • 无法仅在控制台中启动 androidstudio

    你好 我的问题是下一个 我下载了Android Studio如果我去 路径 android studio bin 我执行studio sh 我收到以下错误 No JDK found Please validate either STUDIO
  • numpy 未定义符号:PyFPE_jbuf

    我正在尝试使用一百万首歌曲数据集 为此我必须安装 python 表 numpy cython hdf5 numexpr 等 昨天我设法安装了我需要的所有内容 在使用 hdf5 遇到一些麻烦之后 我下载了预编译的二进制包并将它们保存在我的 b
  • 标准头文件中的 C 编译器错误 - 未定义的 C++ 定义

    我正在尝试编译 C 程序 但收到许多错误 这些错误是在标准 C 头文件 inttypes h stdio h stat h 等 中遇到的 错误的来源是以下未定义的常量 BEGIN DECLS END DECLS BEGIN NAMESPAC
  • Linux 中热插拔设备时检测设备是否存在

    我正在运行 SPIcode http lxr free electrons com source drivers spi spi omap2 mcspi c在熊猫板上 我想知道其中的哪个功能code http lxr free electr
  • 为 Qt 应用程序创建 Linux 安装

    我刚刚用 Qt Creator 制作了一个很棒的程序 我对自己很满意 如何将其从台式机移至笔记本电脑 那么 最好的方法是安装程序 对吗 对于 Ubuntu 这是一个 Debian 软件包 对吗 我怎么做 有人这样做过吗 他们可以分享 QT
  • 在 Ubuntu 16.04 上找不到 printf.c

    我最近切换到Ubuntu 16 04 我在用vscode作为 Ubuntu 上的 IDE 我配置了其他语言 但我无法做到这一点C C 我创建c cpp properties json launch json tasks json 当我开始编
  • linux x86 汇编语言 sys_read 调用的第一个参数应为 0 (stdin)

    我正在编写一个简单的汇编程序来从标准输入读取 如 scanf 这是我的代码 section bss num resb 5 section txt global start start mov eax 3 sys read mov ebx 0
  • 如何让“grep”从文件中读取模式?

    假设有一个很大的文本文件 我只想打印与某些模式不匹配的行 显然 我可以使用egrep v patter1 pattern2 pattern3 现在 如果所有这些模式都在一个文本文件中怎么办 最好的制作方法是什么egrep从文件中读取模式 g
  • Bash 方法的返回值总是模 256

    我有一个 bash 脚本方法 它返回输入值 然而 返回值始终是模 256 的值 我用 google 搜索了一段时间 发现this http www tldp org LDP abs html exitcodes html文章说它总是以 25
  • 适用于 KDE 和 Gnome 的 Gui [重复]

    这个问题在这里已经有答案了 我想为一个现在是 CLI 的应用程序编写一个 gui 它需要在 KDE 和 Gnome DE 中 看起来不错 充分利用用户的外观设置 如果我选择 Qt 或 GTK 我能够做到这一点吗 它们与两个 DE 集成良好吗
  • Linux shell 脚本中的 while 循环超时

    这工作正常 无限循环 while TRUE do printf done 我在尝试着timeout this while loop与timeout命令 所有这些都不起作用 timeout 5 while TRUE do printf don
  • QFileDialog::getSaveFileName 和默认的 selectedFilter

    我有 getSaveFileName 和一些过滤器 我希望当用户打开 保存 对话框时选择其中之一 Qt 文档说明如下 可以通过将 selectedFilter 设置为所需的值来选择默认过滤器 我尝试以下变体 QString selFilte

随机推荐

  • 鲸鱼优化算法论文【matlab代码与仿真】

    一 算法流程 通过回声定位并相互传递探寻猎物信息 研究表明 鲸鱼大脑的某些区域与人类相似 有一种叫做梭形细胞的共同细胞 这些细胞负责人类的判断 情感和社会行为 这种细胞的数量是成年人的两倍 事实证明 鲸鱼可以像人类一样思考 学习 判断 交流
  • 从Kubernetes 1.14 发布,看技术社区演进方向

    Kubernetes 1 14 正式发布已经过去了一段时间 相信你已经从不同渠道看过了各种版本的解读 不过 相比于代码 Release 马上就要迎来5周岁生日的Kubernetes 项目接下来如何演进 其实也是一个让人着迷的话题 而作为一个
  • 在linux中,&和&&,

    对应刚接触linux命令的小伙伴们来说 这些符号一定是很困扰的下面我们一起来看这些符号区别和用法 表示任务在后台执行 如要在后台运行 如 root localhost local java jar test jar gt log txt 运
  • 大型 SaaS 平台产品架构设计

    当我们去搜索 架构 可以得到很多的架构图片 比如组织架构 业务架构 数据架构 技术架构 安全架构 产品架构 部署架构等 什么是架构 通常大家说架构一般指软件架构 架构是指软件的基础结构 创造这些基础结构的准则 以及对这些结构的描述 在这个定
  • IAR常见报错

    右键进入函数出错 project gt clean
  • 利用python进行数据分析之数据聚合和分组运算--小白笔记

    GroupBy机制 split apply combine 拆分 应用 合并 import pandas as pd import numpy as np df pd DataFrame key1 a a b b a key2 one tw
  • 找不到匹配的host key算法

    vim etc ssh sshd config
  • 《WebRTC系列》实战 Web 端支持 h265 硬解

    1 背景 Web 端实时预览 H 265 需求一直存在 但由于之前 Chrome 本身不支持 H 265 硬解 软解性能消耗大 仅能支持一路播放 该需求被搁置 去年 9 月份 Chrome 发布 M106 版本 默认开启 H 265 硬解
  • raw格式详解

    raw格式是camera sensor直接输出的格式 每个像素点表示一个颜色分量B G或R 注意 这句话不准确 红外相机的sensor和彩色相机的sensor有些不同 有的红外相机的sensor输出的raw data就是亮度值 即灰度值 输
  • Android Flutter开发环境搭建

    1 搭建 Flutter 开发环境 本栏亦在快速上手Android Flutter Flutter框架就不介绍了 框架这个东西怎么说呢 对于大部分人来说只是了解即可 如需了解的话 可以度娘资料很多 本节我们主要看下如何在Windwos下搭建
  • Kotlin协程实现原理:CoroutineScope,看完不懂你砍我!墙裂建议收藏。

    今天我们来聊聊Kotlin的协程Coroutine 文末有为大家准备的彩蛋 如果你还没有接触过协程 推荐你先阅读这篇入门级文章What 你还不知道Kotlin Coroutine 如果你已经接触过协程 相信你都有过以下几个疑问 协程到底是个
  • 一个码稿人自述:什么样的文档产品适合我?|深度吐槽

    关注ITValue 看企业级最新鲜 最价值报道 图片来源 Unsplash 钛媒体打工人 媒体相关从业经验4 5年 文档使用重度患者 今天以我曾经用过的 和现在主流的一些文档产品为例 来谈谈我的使用体验 以及什么样的文档适合我 一 我与文档
  • [编程工具]MarkDown编辑查看以及使用语法

    目录 0 前言 1 markDown语法 2 markDown 3 MD正确打开方式 4 结尾 结束啦感谢观看 5 参考连接 0 前言 本文介绍了markDown的编辑查看 使用浏览器查看以及Vscode中查看编辑MD 最后介绍了MD的常用
  • python解析佳明fit文件

    使用 fitparse 解析 佳明 fit 文件 以下示例测试环境为 python 3 8 fitparse 1 2 fitparse 安装 pip3 install fitparse 使用方式 import fitparse from d
  • 蓝牙通讯

    蓝牙通讯 简介 蓝牙API 所需权限 使用蓝牙的步骤 普通调用案例 通讯案例 简介 蓝牙 是一种支持设备短距离通信 一般10m内 且无阻隔媒介 的无线电技术 能在包括移动电话 PDA 无线耳机 笔记本电脑等众多设备之间进行无线信息交换 利用
  • 数据库创建索引和删除索引的方式总结

    一 创建索引 1 1 使用Alter创建索引 1 添加主键索引 特点 数据列不允许重复 不能为null 一张表只能有一个主键 Mysql主动将该字段进行排序 ALTER TABLE 表名 ADD Primary key col 2 添加唯一
  • MySQL安装与启动

    1 MySQL安装包下载 下载地址 https dev mysql com downloads mysql 这里我的电脑是WIN764位的 大家根据自己的电脑自己选择要下载的包 2 解压安装 解压后进入到Windows的DOS命令行下 切换
  • python股票量化交易系统_利用python建立股票量化交易系统(一)

    从今天开始正式开启我的博客之旅 博客内容全部是我自己的量化心得 主要还是为自己将来中工作之中遇到相似问题 可以方便的找到答案 如果能帮到有相似问题的其他同学 我也很开心 如果帮不到的话 不喜勿喷 如果文章中有什么不对的地方 欢迎批评指正 建
  • VI编辑器的使用常用快捷方式编辑命令

    VI编辑器的使用常用快捷方式编辑命令 一 VI编辑器的工作模式 1 VI编辑器有以下三种工作模式 命令模式 输入模式 末行模式 2 不同模式之间的切换 外链图片转存失败 源站可能有防盗链机制 建议将图片保存下来直接上传 img 7BrI0o
  • 【LInux】基础开发工具的使用

    文章目录 一 Linux的应用市场 yum 1 什么是yum 2 为什么要有yum 3 如何使用yum 3 1 前提条件 3 2 搜索软件 3 3 安装软件 3 4 卸载软件 二 Linux的文本编辑器 vim 1 什么是vim 2 为什么