欢迎来到Linux专栏~~Linux环境基础开发工具使用
我们在Linux上安装软件是怎么样安装的呢?
手机应用市场
). 相当于Linux下进行软件安装的客户端。默认列出所有软件
sudo yum list
由于包的数目可能非常之多, 这里我们需要使用 行过滤工具:grep 和 管道只筛选出我们关注的包.
我们以sl小火车为例子:
sudo yum list | grep sl
安装软件
sudo yum install sl.x86_64 以sl小火车为例
安装中会询问这个软件多大,是否安装
这时候敲 “y” 确认安装.出现 “complete” 字样, 说明安装完成
sudo yum install -y 安装软件
-y
:不用询问,我默认许可了
sudo
或者切到 root 账户下才能完成,但是不建议以root身份安装,建议使用普通用户,本文后面有讲如何sudo提高权限安装扩展源
sudo yum install -y -epel-release
可以去找找什么软件好玩的
sudo yum install cowsay.noarch
卸载软件
sudo yum remove sl //以火车为例
同样可以加-y
跳过询问
那我们是怎么样在linux下进行开发的呢?使用gcc、g++、vim、等一个个的独立工具进行
vim是一个文本编辑器,和记事本没有区别,只负责写代码
vim是一款多模式的编辑器,有三种常见模式:命令模式、插入模式,底行模式。
esc
可退回控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及按
i
进入插入模式下,或者按shift+:
进入底行模式
只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式。该模式是我们后面用的最频繁的编辑模式。
文件保存或退出,也可以进行文件替换,找字符串,列出行号等操作。 在命令模式下,shift+: 即可进入该模式。
vim可以直接用键盘上的上下左右来移动,但是我们不建议,后面接触到的命令必须用到hjkl
我们看看最早的老式键盘
[h] ←左移一格
[j] ↓下移一格jump:向下跳
[k] ↑上移一格king:王子高高在上
[L] →右移一格
光标位置锚点
快速定位到结束行 | 【shift + g】 |
---|---|
快速定位到起始行 | gg |
定位到行首 | 【shift + $】 |
定位到行尾 | 【shift + ^】 |
快速定位到某一行
快速定位到某一行 | 【n + shift + g】 |
---|
行内进行跳转 —— 以单词为单位进行光标左右移动
光标跳到下一个字的开头 | w |
---|---|
光标跳到上一个字的开头 | b |
复制粘贴
复制当前行 | yy |
---|---|
n行复制:复制当前及其后共n行 | nyy |
粘贴 | p |
一次性粘贴n次 | np |
撤销恢复
撤销误操作 | u |
---|---|
恢复:撤销最近的撤销 | [ctrl + r] |
删除剪切
从左向右删:删除光标所在位置处的一个字符 | x |
---|---|
支持nx | nx |
从右向左删:删除光标前一个位置处的一个字符[X] | 【shift + x】 |
支持nX | nx |
删除光标所在行 | dd |
---|---|
删除多行 | ndd |
相当于剪切 |
【dd→p】 |
✨局部的修改
快速的大小写切换 | 【shift + ~ 】 |
---|---|
替换模式 | 【shift + r 】 |
替换光标所在处的一个字符 | r + 字符 |
支持nr | nr + 字符 |
常见: vim中字符串儿替换:%s/ / /g
无脑esc
退出
✨双屏操作
vs 文件名 //分屏
[ctrl + ww] 快速切换双屏的光标
注意现在光标在哪个屏幕代表底行就是哪个
在命令模式里:【shift + :
】进入底行模式
set nu 调出行号
set nonu 取消行号
退出——
q 退出
wq 保存并退出
! 强制写入、退出[q!][w!][wq!]
不退出vim执行命令(执行命令行、编译,查看,运行,查看man):!cmd
执行完 回车即可回到vim
注意:不管是root还是普通用户,配置只会影响自己
云服务器上,不含这个配置文件,如果没有就自己创建一个,所有的配置都写入在这个普通文件中
之前我们一直都执行不了sudo,是因为没有信任
那如何添加sudo信任关系?
首先切换成root身份进入家目录
vim /etc/sudoers
gcc是C语言的编译器,g++是Cpp的编译器(兼容c)
源代码生成可执行文件经历了编译+链接,其中编译又分为三个阶段
.o
(Linux) / .obj
(windows)文件合并形成一个可执行程序)那么gcc / g++要不要遵循这样的规则呢?
ESc
,是不是很熟悉呢?就是我们键盘最左上角的那个 ,区分大小写哦iso
,是镜像文件后缀名之一。gcc -E mytest.c -o hello.i
-o
:output自己指定形成的文件,如果不指定,会把结果全部打印到屏幕上。
“-E
:从现在开始进行程序的翻译,如果预处理完成,就停下
可见预处理后还是c语言
-S
:现在开始程序翻译,如果编译完成就停下
gcc -S hello.i -o hello.s
现在开始进行翻译,完成汇编后,停下来
gcc -c hello.s -o hello.o
.o
文件代表:重定位目标文件 ,其人话:经过汇编后变成了二进制
目标文件和链接库经过链接生成可执行程序
gcc hello.o -o hello
我们可以通过file
命令来查看:gcc
默认采用动态链接的方式,形成可执行文件
链接会把自己写的C程序和语言或者第三方库提供的方法关联起来
函数库:在Linux下静态库.o
和动态库.so
两种;windows下静态库为.lib
、动态库为.dll
.a
静态库。静态链接是把库文件的有关代码拷贝到我的可执行文件中,因此生成的文件比较大,但在运行时也就不再需要任何库文件了,可移植性较好。.so
动态库。静态链接,并不会把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库(地址),这样可以节省内存和硬盘的空间。ps:它们没有绝对的好坏,只有谁更合适
C程序是脱离不开C库文件的
若要采用静态链接,需要带选项
gcc hello.c -o hello_static -static
-static
:表面使用静态链接的方式形成可执行程序!
ps:有些机器可能会没有静态库导致连接失败 需要下载静态库libc.a
安装C静态库 & C++静态库指令如下:
sudo yum install glibc-static //c静态库
sudo yum install libstdc++-static //c++静态库
对于gdb的使用,我们的要求是熟悉使用常用指令即可
我们知道程序的发布方式有两种,debug模式和release模式
Linux gcc/g++
出来的二进制程序,默认是release
模式,无法调试的。如果一个二进制的文件可以被调试,一定加入了一些调试信息。
想要调试,必须在gcc/g++编译时候加上-g
选项
gcc -o mytest mytest.c -g
为了演示各种指令
显示代码:要打断点,要先知道行号
l/list 显示源代码
gdb会记录最近一条命令,如果命令无变化可以直接回车
断点:breakpoint
b 行号 在某一行设置断点
d(delete) n 删除序号为n的断点(注:删除时不以行号标定)
info b 查看断点信息
disable n 禁用断点
enable n 启用断点
相当于vs下的——
r/run 运行程序 - 相当于F5
———————————记得打断点——————————
n/next 逐过程 - 相当于F10
s/step 逐语句 - 相当于F11
快速确定代码中是哪一行出错了
finish 结束当前函数
c/continue 直接到下一个断点
until 行号 跳转到指定行 不建议
监视
display 变量名 常显示
p/P 变量名 打印一次
undisplay 数字 取消对变量的常显示
bt 查看当前的调用堆栈
quit 退出
一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作。makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率
理解:爸我是你儿子,使用你给我发生活费
touch一个Makefile来表明依赖关系和依赖方法
touch makefile
.PHONY
:修饰对应符号,让符号变成伪目标
(伪目标:总是被执行的)也确实观察到如果没有对文件进行修改,执行make命令是没有效果的(底层是通过对比修改时间和可执行时间实现的),然而make clean 即便刚刚执行过,也可以随便执行。
也可以这样写——
$@
:目标文件$^
:文件列表总是被执行的:总是会根据依赖关系,执行依赖方法,我们习惯给clean设置
.PHONY
,可执行程序不带
makefile是如何得知,我的可执行文件是最新的?
根据文件最近的更改时间来判断(比较源文件和生成文件时间)
ps:当我们修改内容的时候,有时候change时间也可能会变化
生成项目&清理项目
make 生成解决方案
make clean 清理解决方案
相当于vs下——
ps:❗有些时候我们代码编译不过,就是忘记了保存,所以写入磁盘的时间没有变,系统认为你没有修改,没有编译失败,这时候就要清理一下解决方案,重新生成
make会根据你编写的依赖关系,从上往下自动推导程序的执行
make会在当前目录下找名字叫Makefile或makefile的文件。然后它会默认找文件中的第一个目标文件(target),并把这个文件作为最终的目标文件。
.PHONY:clean
clean:
rm -f mytest
mytest:test.c
gcc test.c -o mytest
在如下代码中,mytest
所依赖的mytest.o
不存在或是被修改,就会执行对应的依赖方法,依赖方法中mytest.o
又不存在,那么make会在Makefile文件中寻找目标为test.o
文件的依赖关系,如果找到则再根据其依赖方法生成test.o
文件,以此类推。(类似于堆栈的过程)。
总之,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。当然依赖后仍然找不到那就只能报错了
首先我们得知道两个概念:
// 1.
#include
int main()
{
printf("hello Makefile!\n");
sleep(3);
return 0;
}
// 2. 发现sleep的过程中,并没有打印。
#include
#include
int main()
{
printf("hello Makefile!");
sleep(3);
return 0;
}
这意味着sleep先于printf执行吗?肯定不是❗
只是printf不带\n
在向显示器打印时,数据不会立即刷新,而是会暂时保存在用户C语言级别的缓冲区中(c语言给我们提供的一块内存),显示器的刷新策略就是行刷新,遇到\n
即把之前的字符串全部显示出来。
那如果我们即不想换行,又想刷新咋办?可以调用这个函数来刷新显示器
fflush(stdout);
思路:不换行,从左至右变长,走完再换行
#include
#include
#include
#define NUM 102
int main()
{
char bar[NUM];
memset(bar,0,sizeof(bar));
const char *lable="|/-\\";//4
int cut = 0;
while(cut <= 100)
{
printf("[%-100s][%d%%] %c\r", bar, cut, lable[cut%4]);
fflush(stdout);
usleep(200000);
bar[cut++] = '#';
}
printf("\n");
return 0;
}
下面一一讲解一下小细节:
fflush
库函数usleep
,单位是微秒\0
我们也算上,然后用menset全部置为0[%-100]
来打印百分比,然后预留100个字符的空间,并且是从左向右打印label
旋转光标,表示当前进度条处于工作状态,注意\为特殊字符需要转义\\
makefile
,一步到位make
makefile
写好ps:注意字体不能调节太小,亲身尽力过,代码代码没做结果是字体太大一行打不完自动换行了
git clone [url] url就是刚刚复制的仓库链接
将代码放到本地的目录中
git add [文件名]
提交改动到本地
git commit -m "日志信息"
日志信息必须写,否则无法提交,且不能乱写,可以写修改了啥
同步到远端服务器上
git push