目录

Linux开发工具

Linux开发工具

linux中下载工具的三种方式

1.源码安装(特别不推荐)

2.软件包安装 –(rpm) 需要自己去安装依赖(.dll)

3.包管理器 yum/apt/apt-get—自动解决包的依赖文件

下载软件:apt-get install 软件名 -y

删除软件 : apt remove 软件名 -y

所谓的包管理器就相当于window中的软件商店,里面有很对的集成开发工具和一些资源。

linux上包管理器中的软件是谁提供给的?

前提引入:如何去评估一款操作系统的好坏?

评估一款操作系统,主要看操作系统的生态,包括使用人群,是否存在社区,以及存在的问题是否能够被解决。

维护配套软件的存在也是为了维护该操作系统稳定的重要一环。

所以说包管理器中的软件是哪些开发者为了维护该操作系统生态稳定为用户进行提供的。

vim

vim常用的操作指令

vim 文件+数字 :打开文件后光标自动跳到该数字行

set num:设置行号

set nonu:取消行号

gg:光标直接回到最开始

shift+g:快速定位到结尾

n+shilft+g:快速定位到第n行

w:以单词为单位向后移动

b:以单词为单位向前移动

yy:复制该行

p:粘贴到光标的下一行

dd:剪切

u:撤销上一步操作

ctrl+r:撤销u操作

x:删除光标位置的字符

shift+x:删除光标左边字符

r:替换光标所在字符

shift+r:批量替换 —替换模式

shift+~:大小写替换

shift+# :查找重复的单词。

ctrl+v: visual block 可视模式(可选中某些行)

eg:注释某些行

1.ctrl+v进入可视模式

2.上下左右(hjkl)确定注释范围(shift +g全部注释)

3.shift+i 进入插入模式(插入//注释符)

4.esc即可完成注释

取消注释

ctrl+v进入可视模式

上下左右(hjkl)选区域

按d即可解除注释

不退出vim就直接进行执行命令

vim时底行实现的操作()esc后

!ls/gcc:直接执行即可

%s/hello world/nihao/ :可以批量替换,后替换前

vs 文件名:多文件分屏操作(分屏后如果进行换终端操作,ctrl+w+w)

/ 单词/字母 :搜索文件中的所有单词字母

vim环境配置

vim会在当前用户的家目录中搜索配置文件 .vimrc(配置后立即生效)

vimrc存在的两个地方1./etc/vimrc(全局配置) 2.~.vimrc(当前用户配置,建议使用)

这里提供了一件安装安装插件,可以根据自己的习惯进行修改。

curl -sLf -o ./install.sh && bash ./install.sh

gcc/g++

linux中C语言头文件包含的地方:/user/include

一个程序如果想要运行必须要经历的运行步骤:

1.预处理

作用:头文件展开,宏替换,去掉注释 , 条件编译 ——-> gcc -E a.c -0 a.i(-E 开始进行程序翻译,在预处理的时候就停下来)

如何理解条件编译:

条件编译就是程序在预处理阶段进行的 代码裁剪 ,根据不同的编译条件,对不必要存在的代码进行裁剪。

命令行级别的编译:gcc code.c -o code -DM=100(缺省,默认为1)

条件编译的用途:

①比如日常专业软件,社区版软件进行下载,程序员只需维护一份源代码即可完成专业版和社区版的区分。

②内核源代码进行裁剪

③开发工具,应用软件(比如在不同平台可以运行同意软件,其实底层内核有两种源代码,根据不同的操作平台,软件本身会裁剪相对应的源码)。

2.编译

作用:把预处理的c语言文件转为汇编语言—>gcc -S a.i -o a.s

为什么要先编译成汇编?

我们可以这样理解:机器语音经过历史的转变(0/0–>汇编—>c语言)如果要把c语言直接翻译成0/1成本太大而且可信度不高(站在巨人的肩膀上),所以站在历史的肩膀上c语言直接翻译成汇编,然后直接翻译成0/1,这样做既节省了成本,又增加了可信度。

3.汇编

作用:对应的汇编编译成二进制->gcc -c a.i -o a.o(根据上边解释很清楚知道这一步的原因)

该二进制文件并不能被执行,因为生成的二进制文件中不包含所有的库,所以需要连接上最后一步,形成可执行程序才能执行。

链接

作用:二进制文件->可执行文件—->gcc a.o -o a.out

链接一些头文件,因为在预处理中展开的只是一些声明。

动静态库

动态库:linux(.so) window(.dll)

静态库:linux(.a) window(.lib)

ldd+可执行文件———>可以看到该程序所依赖的库

动态库(编译的时候进行加载地址)

简单理解:动态库中实现方法(函数) 我们自己实现的可执行程序去调用动态库中实现的方法(这个过程叫链接),然后就可形成可执行程序。(动态链接是指在实现该方法会去动态库中寻找函数(方法)的地址,在库中进行实现,然后在返回)。

动态库又称共享库(可以被多人共享,但是共享库一旦丢失,程序将无法执行)。

静态库(链接的时候有用)

一旦形成可执行程序,静态库可以不在需要。

静态库不同于动态库,在编译时就会把静态库中的方法拷贝到我们写的程序中,进行实现。

动静态库对比(面试常考)

1.加载动态库形成的可执行程序比加载静态库形成的程序体积小。

2.一个可执行程序依赖静态库的程度会比较小。

3.多个程序运行会加载到内存,调用同一个静态库会造成资源浪费,空间浪费。

4.相对3来说,动态链接比较节省内存和磁盘空间。

动静库验证:

https://i-blog.csdnimg.cn/direct/7a1312a8a2364fe8b200a1a76b372c29.png

file+可执行程序:可以看到文件详细信息链接动态库的可执行文件·

所依赖的库(动态库)

ldd+可执行程序:可以看到程序依赖的库

https://i-blog.csdnimg.cn/direct/6b9e055764fb468391fb40ca34e640a3.png

文件大小

https://i-blog.csdnimg.cn/direct/8c8e0be381d347498d5d3dc2987198d6.png 强转静态库

//首先安装c语言静态库

sudo yum install glibc-static

//强制程序使用静态库

gcc a.c -o a.out -static

可以看到是静态链接文件

显示不是一个动态可执行文件 https://i-blog.csdnimg.cn/direct/f436b67cda2c4aeea731253b359cd65c.png

g++验证一模一样

sudo yum install libstdc++-static

g++ a.cpp -o codecpp -libstdc++-static -static

安全共享文件

gcc -c code.c—> code.o:如果不想让对方看到自己的主要文件可以这样搞

https://i-blog.csdnimg.cn/direct/8b8aa4360d7343829c85fc1cc00aee8d.png

如图我们可以把源代码编译成.o文件和头文件一起打包给其他人,然后别人在用打包后的.o文件和自己的main.o文件进行打包使用。

在这里也能清楚的知道了,为什么程序运行要有汇编那一步了

我们自己的程序经过汇编成.o文件,然后和库里边的.h .o文件进行连接Z(所以链接的本质就是把所有的.o文件进行打包)就形成了一个可执行程序。

make/makefile

定义:makefile带来的好处就是⸺⸺“自动化编译”,⼀旦写好,只需要⼀个make命令,整个⼯程完全 ⾃动编译,极⼤的提⾼了软件开发的效率。

//make是⼀条命令,makefile是⼀个文件,两个搭配使⽤,完成项目自动化构建。

makefile创建格式

code:code.c   //依赖关系

(一定是tap建)      gcc code.c -o code    //依赖方法

https://i-blog.csdnimg.cn/direct/32fde71f4713464cadf66d09479fda79.png

清理文件

//生成文件

code:code.c

gcc code.c -o code

//清理文件

.PHONY:clear  / /phony虚伪的,伪造的加上.PHONY 被认为 伪目标

clear: //依赖关系可以为空

rm -rf code  //依赖方法要执行的操作

伪目标理解

使对应的方法和依赖关系 总是能被执行

要理解总是被执行需要了解什么是总不被执行?

1.对于老代码(已经编译过的代码,且源代码并没有被改变)编译器无需再重新执行,但加了伪目标后,程序可以一直被执行,不受约束。

https://i-blog.csdnimg.cn/direct/8e71dbd6047848f8aa12d7596eca492f.png

2.make怎么知道什么时候要更新?

对于linux系统,对于文件有时间日期管理。

https://i-blog.csdnimg.cn/direct/fe611b92ce784a7b8e8578e24c87027c.png

access:查看文件的时间(不会很准确)

modify:修改文件内容的时间

change:修改文件属性的时间(包括文件大小,文件权限属性)

结论:make根据.c文件的时间是否比可执行文件早进行使用make.

eg:如果修改.c文件那么.c文件的日期肯定比上一次执行的可执行文件时间晚,这时候就能使用make。

https://i-blog.csdnimg.cn/direct/d6f489edc33c4cb1b00041730634440d.png

如果想要重新编译,可以使用touch +文件名 修改所有时间

makefile中 定义变量的使用

https://i-blog.csdnimg.cn/direct/2502589ed6de4fa4bc92dda0e074d48c.png

$(变量名):取变量值

@只回显变量值,不回显echo方法只显示内容

makefile里边是可以用$号来取值的

1 BIN=code

2 cc=gcc

3 src=code.c

4 FLAGS=-o

5 RM=rm -rf

6 $(BIN):$(src)

7     $(cc) $(FLAGS) $(BIN) $(src)

echo"linking $@ to $^“ //makefile支持多个方法

#$(CC) $(FLAGS) $@   ($^可以代表多个)

8 .PHONY:test

9 test:

10     @echo $(BIN)

11     @echo $(cc)

12     @echo $(src)

13     @echo $(FLAGS)

14     @echo $(RM)

15 .PHONY:clean

16 clean:

17     $(RM) $(BIN)

一般情况下我们都喜欢用把.c文件编译成.o文件与库文件进行链接

1 BIN=code

2 cc=gcc

3 src=code.c

4 obj=code.o

5 LFLAGS=-o

6 FLAGS=-c

7 RM=rm -rf

8 $(BIN):$(obj)

9     $(cc) $(LFLAGS) $@ $^

10 $(obj):$(src)

11     $(cc) $(FLAGS) $^

12 .PHONY:clean

13 clean:

14     $(RM) $(BIN) $(obj)

1 BIN=code

2 cc=gcc

3 src=code.c

4 obj=code.o

5 LFLAGS=-o

6 FLAGS=-c

7 RM=rm -rf

8 $(BIN):$(obj)

9     @$(cc) $(LFLAGS) $@ $^

10     @echo “Linking…$^ to $@”

11 %.o:%.c                #%这里的意思是一个个.c文件编译形成一个个.o文件

12     @$(cc) $(FLAGS) $<  #一个个编译.c文件

13     @echo “compling…$< to $@”

14 .PHONY:clean

15 clean:

16     $(RM) $(obj) $(BIN)

如果要是编译多文件

BIN=code

2 cc=gcc

3 src=$(shell ls *.c)//执行括号里边的(wildcard *.c)

4 obj=$(src:.c=.o)

5 LFLAGS=-o

6 FLAGS=-c

7 RM=rm -rf

通用makefile文件内容(适合编译c/c++文件)

BIN=processbar

src=$(shell ls *.c)

obj=$(src:.c=.o)

$(BIN):$(obj)

@gcc -o $@ $^

%.o:%.c

@gcc -c $<

.PHONY:clean

clean:

@rm -rf $(obj) $(BIN)

Git

注:这里我只是简单的使用能上传到自己的gitee,后续有时间会写一个git专题

git clone +链接 拉取远程仓库(更换系统)

.git:本地仓库

.gitignore:默认不被上传的文件类型

上传三板斧

git add +文件名/文本名——–>先把文件添加到git暂存区(可以一起上传到仓库)

git commit -m “日志信息” ———>记录你要提交内容的核心内容

git push ———->把仓库中的信息进行提交到远程仓库

git status:查看文件是否被提交

git log:看一下文件提交详细信息

Linux与windows可以共用一个仓库

windos通过命令行,或则小乌龟进行拉取,就能与linux共享目录。

默认创库里的文件提交就是最新版本的文件,如果要修改提交,则要看一下,该文件是否为最新版本,若不是则不能成功提交,需要把最新文件拉取下来(pull)。

gdb

在linux中使用gcc/g++时候,默认的工作模式是release版本,如果向切换到debug模式下需要程序在编译阶段,在最后边加上 -g选项。

cgbd(比较友好的调试器建议使用)

yum install cgdb -y

常见操作:

把一个可执行程序转化为反汇编

objdump  -S mycode >mocode.s

l 行号:从第几行开始查看

b 行号/函数:打断点

info b :查看所打断点,查看断点编号

//gdb不退出,断点依次递增

d 编号 :删除编号断点

r:运行程序

n:直接步过一个过程(函数)

s:逐语句进行调试(可以一直回车,编译器记录最新的一个指令)。

bt:查看调用栈

finish:如果步入一个函数想快速出函数

p 变量名:查看变量名

disable 编号:禁用某个断点

enable  编号:启用某个断点

c(contnine):从一个断点到另一个断点

until 行号:直接跳到指定行号(主要用循环跳出)

display 变量:跟踪一个变量

undisplay 前面编号:取消跟踪

info locals : 可以查看一个函数栈帧中所有变量的值

watch 变量/表达式:监视该变量或许表达式 如果该值变化就提醒

set var flag=1:临时修改变量值,判断是否是这个问题

/

b 行号 if i==10; //条件断点,只触发一次

condition 断点号 条件: 追加条件

总结:

以上为linux开发常用工具,这些工具的深度仅仅只是适用目前开发水平,如有疑惑请私信小编。

创作不易,不喜勿喷,感谢!!!