linux软件安装(一)——源码安装
Linux软件简介
Linux上几乎所有的软件都经过了GPL授权,因此几乎所有的软件都会提供源码。 而一个软件要在Linux上执行,必须是二进制文件,因此当我们拿到软件源码后,需要将它编译成二进制文件才能在Linux上运行。
软件编译过程
将源码编译成可供Linux运行的二进制文件一共需要两步: 1. 使用gcc编译器将源码编译成目标文件 2. 再次使用gcc编译器将目标文件链接成二进制文件
这过程看似简单,实则不然。一个软件的源代码往往被封装在多个源文件中,此外这些文件有错综复杂的依赖关系,编译需要严格按照指定的顺序进行,这无疑增加了编译的难度。好在make命令可以帮助我们简化编译过程。
整个编译过程被浓缩在Makefile文件中,当执行make命令时,make会去当前目录中寻找Makefile文件,并根据该文件中的要求完成整个编译过程。
而Makefile文件由configure命令产生。当执行configure命令时,configure会根据当前系统环境动态生成一个适合本系统的Makefile文件,供make命令使用。
Linux源码安装步骤
- 获取源码 将软件的源码下载至/usr/local/,并解压。
- 查看INSTALL与README文件 解压后查看INSTALL与README文件,这两个文件中详细介绍了本软件的安装方法和注意事项。
- 创建Makefile文件 执行configure命令,生成Makefile文件。
- 编译 执行make clean;make命令将源码编译成二进制文件。 PS:make clean命令用来清除上一次编译生成的目标文件。这个步骤可有可无,但为了确保编译的成功,还是加上为好。防止由于软件中含有残留的目标文件导致编译失败。
- 安装 执行make install命令将上一步编译好的二进制文件安装到指定的目录中去。
安装演示
1.进入/usr/local/,并创建memcached目录:
cd /usr/local/
mkdir memcached
2.下载memcached的源码
wget http://memcached.org/files/memcached-1.4.29.tar.gz
3.解压源码
tar -zxvf memcached-1.4.29.tar.gz
4.执行configure,生成Makefile文件
./configure --prefix=/usr/local/memcached/
此时当前目录下将会生成一个Makefile文件。
- 注意:–prefix参数指定软件安装目录。当执行make install命令时,会将软件安装在此路径中。
5.执行make,编译源码
make clean; make
此时make会读取Makefile文件,将源码编译成二进制文件,并存放在当前目录下。
6.执行make install,将软件安装至指定目录
make install
此时二进制文件会被安装到先前configure prefix参数设置的路径中去。 安装完成!
Linux函数库
1. 什么是“Linux函数库”?
运行在Linux上的软件时常会调用Linux内核的某些功能或其他软件的某些功能,那么这些被软件调用的功能称为Linux的函数库。软件自身的函数库存放在软件安装目录下的lib中,而Linux的函数库存放在/usr/lib和/usr/include中,linux内核的函数库存放在/lib/modules中。
2. Linux函数库的分类
Linux函数库分为静态函数库 和 动态函数库。 1. 静态函数库 - 扩展名:xxx.a - 在编译时会被整合到软件的二进制文件中去。因此拥有静态函数库的软件较为庞大。而且当系统的函数库更新时,引用该函数库的所有软件都需要重新编译才能正常使用。这是非常麻烦的!但拥有静态函数库的软件可以独立运行。 2. 动态函数库 - 扩展名:xxx.so - 在编译时仅仅将函数库的路径整合到软件的二进制文件中去。由于软件中包含的是函数库的路径,因此该软件无法独立运行,且函数库的路径不能发生变化,一旦变化,该软件将无法找到函数库,从而无法运行!这是动态函数库的最大缺点。但当动态函数库更新时,软件无需重新编译,因此更新较为方便,这是动态函数库的最大优点。
目前大部分软件均使用动态函数库,就是因为动态函数库在更新时体现出的优势。
3. 提升函数库读取效率
软件在运行某些功能时需要调用函数库中的函数,而函数库又是以文件的形式存放在外设上。那么如果将函数库存放在内存中,那么将会大大提升读取速度。在Linux中,可以使用ldconfig命令将指定的函数库加载进内存。具体步骤如下: 1. 在/etc/ld.so.conf中设置需要加载进内存的函数库 2. 使用ldconfig命令使配置生效
4. 查看软件的动态函数库
使用ldd命令即可查看指定软件所使用的全部动态函数库。
[root@iZ28st035lsZ usr]# ldd /usr/bin/passwd
linux-vdso.so.1 => (0x00007fffa2bfd000)
libuser.so.1 => /usr/lib64/libuser.so.1 (0x0000003edac00000)
libcrypt.so.1 => /lib64/libcrypt.so.1 (0x0000003edc400000)
libgobject-2.0.so.0 => /lib64/libgobject-2.0.so.0 (0x0000003edcc00000)
libgmodule-2.0.so.0 => /lib64/libgmodule-2.0.so.0 (0x0000003edf800000)
libdl.so.2 => /lib64/libdl.so.2 (0x0000003eda800000)
libglib-2.0.so.0 => /lib64/libglib-2.0.so.0 (0x0000003edc800000)
libpopt.so.0 => /usr/lib64/libpopt.so.0 (0x0000003edd400000)
libpam_misc.so.0 => /lib64/libpam_misc.so.0 (0x0000003edc000000)
libaudit.so.0 => /lib64/libaudit.so.0 (0x0000003edd000000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x0000003edb400000)
libc.so.6 => /lib64/libc.so.6 (0x0000003eda400000)
libpam.so.0 => /lib64/libpam.so.0 (0x0000003edf400000)
librt.so.1 => /lib64/librt.so.1 (0x0000003edbc00000)
/lib64/ld-linux-x86-64.so.2 (0x0000003ed9c00000)
libsepol.so.1 => /lib64/libsepol.so.1 (0x0000003edb800000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003edb000000)
- 由optimizer_switch所引起的诡异问题
- 【Oracle 12c Flex Cluster专题 】— Leaf Node的故障迁移
- MySQL中的统计信息相关参数介绍
- iOS学习——UITableViewCell两种重用方法的区别
- iOS学习——UIPickerView的实现年月选择器
- iOS学习——自动定位
- iOS学习——iOS原生实现二维码扫描
- iOS学习——iOS开发小知识点集合
- iOS学习——@class和#import的区别
- iOS学习——UIView的研究
- iOS学习——布局利器Masonry框架源码深度剖析
- iOS项目——自定义UITabBar与布局
- @FeignClient中的@RequestMapping也被Spring MVC加载的问题解决
- Golang语言中Path包用法
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 数据源管理 | 搜索引擎框架,ElasticSearch集群模式
- PHP的CLI命令行运行模式浅析
- 基于Pytorch构建三值化网络TWN
- 从零学Paddle系列-1 Paddle框架CNN相关API详解
- 智能搜索模型预估框架的建设与实践
- 1,Jupyter NoteBook 常用魔法命令
- 60行代码徒手实现深度神经网络
- 30行代码徒手实现logistic回归
- 8,模型的训练
- 在腾讯云上部署科学计算软件Amber
- 手把手教你搭建一个灰度发布环境
- Kibana: 如何使用 Search Bar
- 「PHP」以nginx、php-cgi为例,把nginx、php-cgi安装为Windows系统服务
- 聊聊dubbo-go的GenericFilter
- 知新 | koa框架入门到熟练第二章