1.开放源码的软件安装与升级
开放源代码:程序代码,写给人类看的程序语言,但机器不认识,无法执行。
编译器:将程序代码转译成机器能看懂的语言。
可执行文件:经过编译器变成的二进制程序。
Tarball文件:
将软件的所有源文件先以tar打包,然后再以压缩技术来压缩,常见的是以gzip来压缩,Tarball文件一般的扩展名会写成*.tar.gz或*.tgz。
所以,Tarball是一个软件包,里面通常有:
源代码文件
检测程序文件(可能是configure或config等文件)
本软件的简易说明与安装说明(INSTALL或README)
2.gcc的简易用法
gcc hello.c
不加任何参数,则执行文件的文件名会被自动设置为a.out
这也是常常看到命令gcc hello.c && ./a.out
的原因。
# 仅将源代码编译成为目标文件
[root@study ~]# gcc -c hello.c
# 会自动产生hello.o这个文件,但不会产生二进制执行文件
# 在编译的时候,根据操作环境给予最佳化执行速度
[root@study ~]# gcc -O hello.c -c
# 会自动产生hello.o这个文件,并且执行速度最佳
# 在进行二进制文件制作时,将链接的函数库与相关的路径加入
[root@study ~]# gcc sin.c -lm -L/lib -I/usr/include
# 这个命令通常使用在最终链接成二进制文件的时候;
# -l 是加入某个函数库的意思,m则是libm.so 或 libm.a这个函数库,故-lm 指的是 libm.so 或 libm.a 这个函数库的文件;
# -L 后面接的路径是刚刚上面的那个函数库的查找目录;
# -I 后面接的是源代码内的include文件所在的目录。
# 将编译的结果输出成某个特定的文件名,这里是hello
[root@study ~]# gcc -o hello hello.c
# -o 后面接的是要输出的二进制文件名
# 在编译的时候,输出较多的信息说明
[root@study ~]# gcc -o hello hello.c -Wall
# 加入 -Wall 之后,程序的编译会变得较严谨,所以警告信息也会显示出来
3.用make进行宏编译
3.1makefile的基本语法与变量
基本的makefile规则是这样的:
目标(target): 目标文件1 目标文件2 ...
<tab> gcc -o 欲建立的执行文件 目标文件1 目标文件2 ...
<tab>需要在命令行的第一个字符
目标与依赖文件之间需要以 : 隔开
在makefile中 $@ 代表目前的目标(target)
当重复的数据很多时,makefile中也可以使用变量来简化:
[root@study ~]# vi makefile
LIBS = -lm
OBJS = main.o haha.o sin_value.o cos_value.o
main: ${OBJS}
gcc -o main ${OBJS} ${LIBS}
clean:
rm -f main ${OBJS}
与bash shell 的语法有点不同,变量的基本语法为:
1.变量与变量内容以 = 隔开,两边可以具有空格
2.变量左边不可以有<tab>
3.变量与变量内容在 = 两边不能有 :
4.在该shell的环境变量是可以被套用,例如CFLAGS这个变量
5.在命令行模式也可以设置变量
注意:①make命令行后面加上的环境变量为优先
②makefile里面指定的环境变量第二
③shell原本具有的环境变量第三
3.2make使用示例
[root@study ~]# vi makefile
main: main.o haha.o sin_value.o cos_value.o
gcc -o main main.o haha.o sin_value.o cos_value.o -lm
clean:
rm -f main main.o haha.o sin_value.o cos_value.o
[root@study ~]# make clean
rm -rf main main.o haha.o sin_value.o cos_value.o
[root@study ~]# make clean main
rm -rf main main.o haha.o sin_value.o cos_value.o
cc -c -o main.o main.c
cc -c -o haha.o haha.c
cc -c -o sin_value.o sin_value.c
cc -c -o cos_value.o cos_value.c
gcc -o main main.o haha.o sin_value.o cos_value.o -lm
使用make的好处:
简化编译时所需执行的命令
若在编译完成之后,修改了某个源代码文件,则make仅会针对被修改的文件进行编译
最后可以依照依赖性来更新执行文件
4.Tarball的管理与建议
建议:
最好将Tarball的原始数据解压缩到/usr/local/src当中;
安装时,最好安装到/usr/local这个默认路径下;
考虑到未来的反安装步骤,最好可以将每个软件单独安装在/usr/local下面
为安装到单独目录的软件的man page加入man path查找:
如果安装的软件放置在/usr/local/software/,那么在man page查找的设置中,可能就要在/etc/man_db.conf内的40-50行左右,加入:
MANPATH_MAP /usr/local/software/bin /usr/local/software/man
这样才可以使用man来查询该软件的在线文件。
4.1利用ntp来示范
利用时间服务器(network time protocal)的ntp软件来测试安装。
假设ntp-4.*.*.tar.gz这个文件放置在/root目录下;
源代码解压到/usr/local/src下
软件安装到/usr/local/ntp目录中
到https://www.ntp.org/downloads/中下载文件:
wget https://archive.ntp.org/ntp4/ntp-4.2/ntp-4.2.8p17.tar.gz
解压缩,并阅读INSTALL/README文件:
[root@study ~]# cd /usr/local/src
[root@study src]# tar -zxvf /root/ntp-4.2.8p3.tar.gz
ntp-4.2.8p3/ <==系统会新建这个目录
ntp-4.2.8p3/CommitLog
....(底下省略)....
[root@study src]# cd ntp-4.2.8p3
[root@study ntp-4.2.8p3]# vi INSTALL
检查configure支持参数,并实际创建makefile规则文件:
[root@study ntp*]# ./configure --help | more <==查询可用参数
--prefix=PREFIX install architecture-independent files in PREFIX
--enable-all-clocks + include all suitable non-PARSE clocks:
--enable-parse-clocks - include all suitable PARSE clocks:
# 上面列出的是比较重要的
[root@study ntp*]# ./configure --prefix=/usr/local/ntp \
> --enable-all-clocks --enable-parse-clocks <==开始建立makefile
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
....(省略)....
checking for gcc... gcc <==也有找到 gcc 编译器!
....(省略)....
config.status: creating Makefile <==
config.status: creating config.h
config.status: creating evconfig-private.h
config.status: executing depfiles commands
config.status: executing libtool commands
最后开始编译与安装:
[root@study ntp*]# make clean; make
[root@study ntp*]# make check
[root@study ntp*]# make install
4.2利用patch更新源代码
了解可用patch文件即可。
5.函数库管理
静态函数库:编译时会整合到执行程序中
动态函数库:编译时不会整合到执行程序中,具有指向动态函数库所在的指针,linux大多采用这个。
5.1将函数库加载到高速缓存
目的:提高动态函数库的读取速度
ldconfig [-f conf] [ -C cache]
ldconfig [-p]
选项与参数:
-f conf:conf指的是某个文件名,作为函数库的获取路径,而不是用默认的etc/ld.so.conf
-C cache:cache值得是某个文件名,使用cache作为高速缓存的函数库数据,而不是默认的/etc/ld.so.cache
-p:列出目前所有函数库数据内容(在/etc/ld.so.cache内的数据)
5.2程序的动态函数库解析:ldd
ldd [-vdr] [filename]
选项与参数:
-v:列出所有内容信息
-d:重新将数据有遗失的链接点显示出来
-r:将ELF有关的错误内容显示出来
6.校验软件正确性
md5sum/sha1sum/sha256sum [-bct] filename
md5sum/sha1sum/sha256sum [--status|--warn] --check filename
选项与参数:
-b:使用二进制文件的读取方式,默认使用windows/DOS文件格式的读取方式
-c:校验文件校验值
-t:以文本方式读取文件校验值
这里以md5为例:
继续用前面的ntp例子,到官网下载md5校验文件:
wget https://archive.ntp.org/ntp4/ntp-4.2/ntp-4.2.8p17.tar.gz.md5
查看官网提供的md5数据:
[root@study ~]# cat ntp-4.2.8p17.tar.gz.md5
MD5 (ntp-4.2.8p17.tar.gz) = a15558df580bd1b955a105a8b91c078f
测试下载的文件的校验值:
[root@study ~]# md5sum ntp-4.2.8p17.tar.gz
a15558df580bd1b955a105a8b91c078f ntp-4.2.8p17.tar.gz
对比发现校验值一样,说明下载的文件没问题。
评论区