3. Linux 源码编译 001

发布时间 2023-11-29 10:10:05作者: 谱次·

重点:

  1. rpm -i -e -qi -ql -qf -qa --scripts。
  2. yum install remove info list repolist provides。
  3. 配置系统源。
  4. 搭建私有仓库服务器。
  5. 源码编译安装。
  6. ubuntu dpkg apt /etc/apt/sources.list。

1)介绍 源码编译

虽然有很多开源项目将软件打成 RPM 包,供人们使用,但并不是所有源代码都打成包,如果想使用开源软件,大部分可能需要自行下载源码,进行编译安装。

另外即使提供了 RPM 包,在生产中经常针对软件的某些特性,比如对软件版本的要求。仍然需要自行编译安装。但源代码编译安装是比较繁琐的,庆幸的是有相关的项目管理工具可以大大减少编译过程的复杂度。

 

编译安装 优势:

1)使用 yum 安装软件可以确保便捷性,但它可能限制了一些自定义选项。

比如 yum 安装会自动将软件安装到其默认路径。然而,对于更多的自定义需求,编译安装(configure 编译安装)可能是更灵活的选择。

编译安装允许您传递参数,指定安装路径,启用或禁用特定功能,并满足特定的需求。

这种方式提供了更多的控制权,适用于需要定制化配置的情况,但也需要更多的手动工作和处理依赖关系。

2)使用 yum 安装的软件通常会根据软件包的默认路径分散安装在系统中,而编译安装可以将所有文件统一存放在指定目录中,提供了更好的管理和维护灵活性。

这有助于集中管理并更加容易卸载整个应用程序,只需删除相关目录即可。

3)使用 yum 安装软件时,系统通常会将软件的所有默认特性都安装,这可能会导致资源浪费,尤其是如果您只需要其中一部分特性。

此外,某些特定特性可能不是默认安装的,你还需要手动配置或单独安装,这会增加配置的复杂性。

在这种情况下,编译安装允许您更精确地选择所需的特性,并自定义软件的安装配置,以确保满足项目需求,同时减少不必要的资源占用。

这种方式提供了更大的灵活性,可以更好地满足特定用例的要求,而不是盲目地安装所有默认特性。

 

程序包编译安装

源代码 >> 预处理 >> 编译 >> 汇编 >> 链接 >> 执行

多文件:文件中的代码之间,很可能存在跨文件依赖关系。

 

2)获取开源程序源代码

项目官方自建站点:

  1. apache.org
  2. mariadb.org

代码托管:

  1. Github.com
  2. Gitee.com
  3. SourceForge.net
  4. code.google.com

 

3)编译源码的项目工具

  1. C、C++ 的源码编译:使用 make 项目管理器。
    1. configure 脚本 >> Makefile.in >> Makefile

相关开发工具:

autoconf: 生成 configure 脚本

automake:生成 Makefile.in

  1. java 的源码编译: 使用 maven。

 

4)C 语言源代码 编译安装过程

利用编译工具,通常只需要 三个大的步骤。

  1. ./configure
    1. 通过选项 传递参数,指定安装路径、启用特性等;执行时会参考用户的指定以及 Makefile.in 文件 生成 Makefile 文件。
    2. 检查依赖到的外部环境,如依赖的软件包。

./configure --prefix=/apps/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-http_perl_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module

  1. make 调用 Makefile 文件,会检测依赖的环境,进行构建应用程序。

make -j4

  1. make install 复制文件到相应路径。

make install

注意:安装前可以通过查看 README,INSTALL 获取帮助。

 

4.1)编译安装准备

准备:安装相关的依赖包

  1. 开发工具:make, gcc (c/c++编译器GNU C Complier)
  2. 开发环境:开发库(glibc:标准库),头文件,可安装开发包组 Development Tools
  3. 软件相关依赖包。

生产实践:基于最小化安装的系统建议安装下面相关包。

yum install gcc make autoconf gcc-c++ glibc glibc-devel pcre pcre-devel openssl openssl-devel systemd-devel zlib-devel vim lrzsz tree tmux lsof tcpdump wget net-tools iotop bc bzip2 zip unzip nfs-utils man-pages

 

4.2)编译安装

第一步

运行 configure 脚本:生成 Makefile 文件。

其选项主要功能:

      1. 可以指定安装位置
      2. 指定启用的特性

[ 获取其支持使用的选项 ]

./configure --help

选项分类:

  1. 安装路径设定
    1. --prefix=/PATH:指定默认安装位置,默认为/usr/local/。
    2. --sysconfdir=/PATH:配置文件安装位置。
    3. System types:支持交叉编译。
  2. 软件特性和相关指定:
    1. Optional Features:可选特性
      1. --disable-FEATURE
      2. --enable-FEATURE[=ARG]
    2. Optional Packages: 可选包
      1. --with-PACKAGE[=ARG]
      2. --without-PACKAGE

注意:通常被编译操作依赖的程序包,需要安装此程序包的 "开发" 组件,其包名一般类似于 name-devel-VERSION。

 

第二步

make

 

第三步

make install

 

4.3)安装后的配置

第一步

二进制程序目录导入至 PATH 环境变量中

编辑文件 /etc/profile.d/NAME.sh

export PATH=/PATH/TO/BIN:$PATH

 

第二步

相关用户及文件

有些开源软件编译完成后,还需要创建相关的用户及文件。

 

第三步

导入帮助手册

编辑 /etc/man.config|man_db.conf 文件,添加一个 MANPATH

 

5)编译安装 实战案例

5.1)示范 1

CentOS 7 编译安装 tree2.1

// 查看`软件包详细信息`

rpm -qi tree

截图.png

 

官网下载最新软件包源码

wget http://mama.indstate.edu/users/ice/tree/src/tree-2.1.1.tgz

截图.png

 

tgz:其实就是 tar.gz 的简写。

tar xzvf tree-2.1.1.tgz -C /usr/local/src

截图.png

cd /usr/local/src && ls

 

// 进入源码包目录

cd tree-2.1.1/ && ls

[ 可以看到,该目录下并没有 configure 脚本,直接存在的 Makefile 文件,这是什么原因呢?]

这种情况通常发生在软件项目非常简单,不需要复杂的配置步骤时。在这种情况下,开发者可能会直接提供一个简单的 Makefile 文件,而不使用更复杂的 configure 脚本。这样可以简化软件的构建过程,使其更容易使用和编译。

截图.png

 

修改 Makefile 自定义软件存放路径

// 自定义`配置信息`

// `修改软件存放路径`

vim Makefile

截图.png

 

甚至 我们还可以修改其源码。

// 我们将原本代码中编写的 2.1.1 版本信息

// 修改为了 8.8.8

vim tree.c

 

/2.1.1

截图.png

// 安装相关软件包

yum install gcc make autoconf gcc-c++ glibc glibc-devel pcre pcre-devel openssl openssl-devel systemd-devel zlib-devel vim lrzsz tree tmux lsof tcpdump wget net-tools iotop bc bzip2 zip unzip nfs-utils man-pages

 

// 验证 GCC

gcc -v

截图.png

 

1. 编译

make

 

2. 编译安装

make install

截图.png

 

// 验证

ll /apps

 

// 查看版本

/apps/tree/bin/tree --version

 

// 验证命令

/apps/tree/bin/tree

截图.png

截图.png

 

1. 软链接[ 针对全局 ]

[ 所有用户都会优先寻找 /usr/local/bin 下的二进制文件,因此所有用户都会优先执行该版本 tree 命令 ]

// "老版本 tree 路径"

[15:41:29 root@blog ~] which tree

/usr/bin/tree

 

// `查看 PATH 默认会找寻哪些目录下的 bin 文件`

[15:43:58 root@blog ~] echo $PATH

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

 

// `将新版本 tree 执行另一个 PATH 也会找寻的路径 "并且优先级比 /usr/bin 高"`

[15:44:36 root@blog ~] ln -s /apps/tree/bin/tree /usr/local/bin/

 

// "清理缓存"

[15:44:36 root@blog ~] hash -r

 

// "根据 PATH 可以得知"

// `系统会优先找寻 /usr/local/bin 下的二进制文件进行执行` "/usr/local/bin 优先级更高"

[15:44:36 root@blog ~] tree

截图.png

 

 

2. 别名 [ 针对用户 ]

alias tree='/usr/bin/tree'

截图.png

 

3. 环境 [ 实用 ]

// "软链接 and 别名"

// `仅针对一个二进制文件进行处理`

echo 'PATH=/apps/cmatrix/bin:$PATH' > /etc/profile.d/cmatrix.sh

source /etc/profile.d/cmatrix.sh

 

5.2)示范 2

编译安装 cmatrix

截图.png

1. 安装相关软件包

yum install gcc make autoconf gcc-c++ glibc glibc-devel pcre pcre-devel openssl openssl-devel systemd-devel zlib-devel vim lrzsz tree tmux lsof tcpdump wget net-tools iotop bc bzip2 zip unzip nfs-utils man-pages

 

2. 下载并解压缩包

cd /usr/local/src

wget https://github.com/abishekvashok/cmatrix/releases/download/v2.0/cmatrix-v2.0-Butterscotch.tar

tar xvf cmatrix-v2.0-Butterscotch.tar

 

3. 配置

cd cmatrix/

 

// more configure # configure 是一个脚本

// configure --help # 查看 configure 帮助

./configure --prefix=/apps/cmatrix

截图.png

 

4. 编译

make -j 2

 

// 4.1 make 编译报错, 缺 curses.h 文件 [ 2. make 编译报错, 缺 autoheader 命令, 也可执行 yum provides xxx 找到命令依赖的软件包名称, 而后安装即可 ]

// 4.2 yum provides 查找该文件所属哪个软件包

// 4.3 安装该软件包

yum install ncurses-devel-5.9-14.20130511.el7_4.i686

截图.png

截图.png

 

如何解决??

[ 重头开始,重新编译。]

// 重要依赖

yum -y install ncurses* gcc gcc-c++

 

// 重新编译

cd ..

rm -rf cmatrix/

tar xvf cmatrix-v2.0-Butterscotch.tar

cd cmatrix/

 

// configure 配置

./configure --prefix=/apps/cmatrix

 

// 编译并安装

make

make install

 

// 验证

ll /apps

截图.png

截图.png

 

5. 配置环境 "建议"

echo 'PATH=/apps/cmatrix/bin:$PATH' > /etc/profile.d/cmatrix.sh

source /etc/profile.d/cmatrix.sh

 

// 或者用软链接实现

// ln -s /apps/cmatrix/bin/cmatrix /usr/local/bin/

 

6. 运行

cmatrix -a -b -C green

截图.png

 

7. 帮助

 

man cmatrix

截图.png