什么是软件包?
在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序.但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在一个服务器上, 通过包管理器可以很方便的获取到这个编译好的软件包, 直接进行安装.软件包和软件包管理器, 就好比 “App” 和 “应用商店” 这样的关系.
yum(Yellow dog Updater, Modified)是Linux下非常常用的一种包管理器. 主要应用在Fedora, RedHat,Centos等发行版上.
注意事项
关于 yum 的所有操作必须保证主机(虚拟机)网络畅通!!!,可以通过ping指令验证:ping www.baidu.com
yum的N板斧—前提是需要切换到root用户
关于 rzsz
例如使用yum list,可以查看当前的所有应用软件,使用yum list | grep [xxx] ,"|"为管道,可以过滤上级的结果作为下级的输入将我们需要的软件名称传递给grep命令,然后再进行输出
例如安装:yum install -y lyzsz,安装后有如下指令
rz指令:
可以将win本地的文件上传到linux中
sz [filename]
可以将linux的文件下发到win本地
查看软件包
指令:yum list | grep lrzsz
结果: lrzsz.x86_64 0.12.20-36.el7 @base
注意事项:
vim格式:vim [filename]
三种模式:
三种模式之间转换图:
在编辑当中有7字箴言,每一个字代表vim当中的一个操作,熟悉之 后对操作是如虎添翼:移删复替撤更跳
在普通模式下:
vim的底行模式命令
gcc – >编译C代码 g++ – > 编译C++代码
1. 背景知识
2. gcc如何完成
格式 gcc [选项] 要编译的文件 [选项] [目标文件]
预处理(进行宏替换)
展开头文件,宏替换,去注释,条件编译
语法:gcc/g++ -E [源码文件] -o [预编译处理后文件名称].i
实例:gcc -E test.c -o test.i 将test.c文件预处理为test.i文件
编译(生成编译)
语法语义的检测,生成了汇编代码
语法:gcc/g++ -S [源码文件] -o [编译之后的文件名称].s
实例:gcc -S test.c -o test.s 将test.c文件编译为test.s文件
汇编(生成机器可识别代码)
将汇编代码转换成机器代码
语法:gcc/g++ -c [源码文件] -o [汇编之后的文件名称].o
链接(生成可执行文件或库文件)
将生成程序需要的所有.o文件,链接在一起,生成可执行程序
语法:gcc/g++ [xxx].o -o []
最后,也可直接生成可执行程序文件,不需要经过上述的预处理、编译、汇编、链接等过程,语法如下:
语法:gcc/g++ [源码文件] -o [生成可执行程序文件]
在这里涉及到一个重要的概念:函数库
我们的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实“printf”函数的呢?
最后的答案是:系统把这些函数实现都被做到名为 libc.so.6 的库文件中去了,在没有特别指定时,gcc 会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现函数“printf”了,而这也就是链接的作用。
函数库一般分为静态库和动态库两种
静态库是指编译链接时,把库文件的代码全部加入到可执行文件中, 因此生成的文件比较大, 但在运行时也就不再需要库文件了。其后缀名一般为“.a”
动态库与之相反 ,在编译链接时并没有把库文件的代码加入到可执行文件中 ,而是在程序执行时由运行时链接文件加载库, 这样可以节省系统的开销。动态库一般后缀名为“.so” ,如前面所述的libc.so.6 就是动态库。gcc在编译时默认使用动态库。完成了链接之后,gcc就可以生成可执行文件,如下所示。gcc hello.o –o hello
gcc默认生成的二进制程序,是动态链接的,这点可以通过file命令验证。
以下是加图片的详述:
首先用ldd test命令输入后观察系统库文件的相关内容,ldd test查看动态库文件后如下:
libstdc++.so.6 —> C++为我们程序员提供的动态库文件
libc.so.6 —> C语言为我们程序员提供的动态库文件
静态链接:需要增加命令行参数 -static
其中test为动态文件,test1为静态文件,静态文件的大小要比动态文件的大小大的多,是因为动态链接的时候动态库和动态文件没有在一起,每次执行的时候需要单独去动态库调用,所以生成的可执行文件就比价小。相反的静态文件和静态库在一块,执行的时候则只需要链接库文件就可生成可执行文件。相关图形如下所示:
也可以用file test查看文件的属性,查看动态文件后如下:
查看静态文件后如下:
1. 背景
程序的发布方式有两种,debug模式和release模式,Linux gcc/g++出来的二进制程序,默认是release模式,要使用gdb调试,必须在源代码生成二进制程序的时候, 加上-g选项。
实例 :g++ test.cpp -o test -g 生成realease模式
2. 开始调试
调试语法:gdb [可执行程序]
list/l 行号:显示binFile源代码,接着上次的位置往下列,每次列10行
list/l 函数名:列出某个函数的源代码
r或run:运行程序
n或next:单条执行,逐过程,相当于vs中的f10
s或step:进入函数调用,逐语句,相当于vs中的f11
(b) breakpoint 行号:在某一行设置断点
break 函数名:在某个函数开头设置断点
(i b)info break :查看断点信息
finish:执行到当前函数返回,然后挺下来等待命令
§print:打印表达式的值,通过表达式可以修改变量的值或者调用函数
p (print)变量:打印变量值
set var:修改变量的值
continue(c):继续执行,在vs中的f5
run(r):让程序跑起来
delete:删除所有断点
delete [断点序号]:删除序号为n的断点
disable [断点序号]:禁用断点
enable [断点序号]:启用断点
(i) info breakpoints:参看当前设置了哪些断点
display 变量名:跟踪查看一个变量,每次停下来都显示它的值
undisplay:取消对先前设置的那些变量的跟踪
until X行号:跳至X行
(b t)breaktrace:查看各级函数调用及参数
(i)info locals:查看当前栈帧局部变量的值
quit:退出gdb
3. 程序崩溃产生coredump文件
coredump文件叫核心转储文件。保存的是程序在崩溃之前正在做的事情,已经改变各个变量之间的内容;
coredump文件查看语法:gdb [可执行程序] coredump
bt : 查看调用堆栈
代码在27行产生了问题
如果有coredump文件,则常见的错误:
段错误:如果有11号信号 - -> 考虑代码是否访问内存越界,考虑代码的是否访问空指针
double free:6号 - -> 考虑是否重复释放
在终端中输入:ulimit -a,查看linux操作系统的限制信息
core file size (blocks, -c) 0
coredump文件的大小取决于core file size的大小 ---- 软件限制
如何修改:ulimit -c unlimited ----> 修改成没有限制的,再次输入ulimit -a,查看Linux操作系统的限制信息
假如程序崩溃,系统产生了50G大小的文件,而core file size的大小为0,就不会产生核心转储文件了,假如core file size没有限制,则最后系统程序崩溃,系统则会产生核心转储文件。但另一方面产生的核心转储文件又由硬件的磁盘限制,假设磁盘只剩下2g,而产生的核心转储文件有5g,则也不能产生核心转储文件。
背景
会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作。
makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。
make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。
详述
1. make是自动化解释工具,解释Makefile文件内容
2. Makefile编写规则
目标对象:想要生成的目标对象
依赖对象:生成目标对象的时候依赖哪些文件,这些文件被称之为依赖对象
编译命令:使用依赖对象生成目标对象的方法
编写规则如下:
实例:1 首先建立一个名为test.cpp文件,并且让其输出“舒服”两字;
2 使用 vim makefile打开Makefile文件,其中M大小写不做区分;
3 按照上图格式输入;
4 保存并返回,输入make,产生out输出文件,随后用ls查看
5 输出文件 ./out --> 舒服
3. make解释Makefile的规则
3.1 对比目标对象和依赖对象最后一次的修改时间
3.1.1 如果目标对象最后一次的修改时间比较新,则认为目标对象比价新,不需要重新生成目标对象
3.1.2 反之,则重新生成
3.2 永远只为了生成第一个目标对象而服务
此时生成的目标对象是test文件,而不是out文件
若要同时生成多个目标文件,语法 --> 伪目标:可执行程序A 可执行程序B,如下所示:
退出保存后,make命令进行自动化编译,可以看到同时编译两个目标文件,并最后生成:
3.3 如果依赖对象不存在,则会在当前的Makefile的编写规则当中查找生成依赖对象的方法
4. 预定义变量
管理代码仓库
1. 克隆远端仓库到本地,推送文件到远端仓库
git clone [url] --> 将GitHub中仓库克隆到当前的某个文件夹中
1.1 git标记:git add [filename/foldername]
1.2 提交到本地仓库:git commit -m “本次提交的日志信息”
1.3 推送到远端仓库:git push origin master
2. 删除远端仓库的内容
2.1 删除本地仓库文件:git rm [filename]
2.2 提交远端git:git commit -m “xxxx”
2.3 推送远端git:git push origin master
3. 将远端内容发送到本地Linux机器仓库中