起始

服务器选用的AnolisOS 7.9系统、在阿里云安装php7.4。如果php8的话建议选择AnolisOS8.*因为系统自带的源的软件不一样,依赖库的版本不一样。系统越新依赖越新。

我在编译安装PHP的时候提示system libzip must be upgraded to version >= 0.11。系统自带的libzip版本比较低,不符合要求。所以需要升级。

首先,卸载系统自带的libzip

yum -y remove libzip-devel

因为系统自带的源版本比较低、卸载后需要官网下载。 传送门:libzip.org

我之前使用的是libzip-1.3.2版本,最近安装的时候官网不提供这个版本了只有最新。

有些时候版本变化是不一定写在官网上的.......

就是安装默认的目录变了。以前的默认目录是/usr/local/lib。而这次编译安装后的默认目录是/usr/local/lib64

随之而来的是php7.4安装始终报错缺少libzip

如果你在服务器安装的软件顺序不一样,就有可能不会出现这个编译完libzip这个问题了。具体原因在下面

pkg-config

是一个辅助工具,用于在编译和链接程序时方便地查找库文件及其相关信息。它主要用于解决依赖问题,使得编译和链接过程更加简洁和自动化。

主要功能

查找库文件

库文件(Library Files)

库文件包含函数和变量的实际实现代码,可以被多个程序共享使用。库文件可以是静态库(.a 或 .lib)或动态库(.so 或 .dll)。

内容:库文件包含已编译的机器代码,可以直接被链接到最终的可执行程序中。

使用:在编译和链接阶段,链接器将源文件中调用的函数与库文件中的实现代码连接起来。

示例:libc.so 是一个标准C库的动态库,包含了标准库函数的实现。

pkg-config帮助编译器和链接器找到所需的库文件。通过查询 .pc 文件,它能够提供正确的库文件路径。
提供编译和链接选项:

.pc 文件(pkg-config 文件)包含了库的元数据。这些文件通常放在 pkg-config 的搜索路径中,如 /usr/lib/pkgconfig、/usr/local/lib/pkgconfig、/usr/share/pkgconfig或其他自定义路径。一个典型的 .pc 文件可能包含以下信息:

  • 库名(Name:库的名称。
  • 描述(Description:库的描述。
  • 版本(Version:库的版本。
  • 编译选项(Cflags:编译器需要的标志。
  • 链接选项(Libs:链接器需要的标志。
# cat /usr/local/lib64/pkgconfig/libzip.pc

prefix=/usr/local
exec_prefix=${prefix}
bindir=${prefix}/bin
libdir=${prefix}/lib64
includedir=${prefix}/include

zipcmp=${bindir}/zipcmp

Name: libzip
Description: library for handling zip archives
Version: 1.10.1
Libs:  -L${libdir} -lzip
Libs.private:  -lzstdlzma -lzstdOpenSSL::Crypto -lzstdZLIB::ZLIB
Cflags: -I${includedir}

查找头文件路径

头文件(Header Files)


头文件通常包含函数声明、宏定义、类型定义和其他预处理指令。这些文件通常以 .h 为扩展名。

内容:头文件会声明函数和变量的原型,但不包含实际的实现代码。

使用:头文件通过 #include 指令包含在源文件中,这样编译器在编译源文件时就能知道函数和变量的定义。

示例:stdio.h 是一个标准头文件,包含了输入输出函数(如 printf 和 scanf)的声明。

提供头文件的路径,使编译器能够找到所需的头文件

具体信息参考上面.pc文件的includedir

提供编译和链接选项

它可以提供编译器和链接器需要的参数,以便在使用库时简化编译过程。
提供用于编译和链接的正确标志(flags)。这些标志包括头文件路径(CFLAGS)和库文件路径(LDFLAGS)。
管理依赖关系:

.pc配置文件中的两个配置

  • Cflags:编译时需要的标志,通常包括头文件路径。
  • Libs:链接时需要的标志,通常包括库文件路径和库名。

处理库之间的依赖关系

可以处理库之间的依赖关系。例如,如果一个库依赖于另一个库,pkg-config 会自动提供所有需要的编译和链接选项。
.pc 文件

.pc配置文件中的两个配置

  • Requires:依赖的其他库

到了这个时候通过设置环境变量
export LD_LIBRARY_PATH=/usr/local/lib64:$LD_LIBRARY_PATH
来解决php安装libzip依赖的问题。
但是不能永久解决。这时候需要ldconfig工具进行配置

ldconfig工具

上文提到:“如果你在服务器安装的软件顺序不一样,就不会出现找不到安装后的libzip”

如果你提前用yum|dnf安装了软件。那么它会在 /etc/ld.so.conf.d目录下生成conf配置文件。会指引库文件的目录

# cat  /etc/ld.so.conf.d/libzip.conf
/usr/local/lib64

如果下面有你正好要用到的目录配置,那么就不会出现这个问题

主要功能

更新共享库缓存

  • ldconfig 的主要功能是更新系统中的共享库缓存文件(通常是 /etc/ld.so.cache)。
  • 这个缓存文件包含共享库的路径信息,可以加速动态链接器在运行时查找共享库的过程。

创建符号链接

ldconfig 可以自动创建库文件的符号链接。例如,当有多个版本的同一个库时,它会为主要版本创建一个通用符号链接,以便于程序查找

运行 ldconfig

通常在以下情况下需要运行 ldconfig:

  • 安装新的共享库。
  • 删除或移动现有共享库。
  • 修改 /etc/ld.so.conf或者/etc/ld.so.conf.d/下的文件或其包含的任何配置文件。

运行ldconfig

总结

以前编译安装根据当时的时间,php安装的时候刚发布不久,一些软件版本基本都兼容。后期随着时间推移之前的软件不更新或者有bug等其他因素多少会出现点不一样,今天是对linux系统和c语言库和编译更深层次的了解

# 添加 /usr/local/lib64 到 ld.so.conf.d 并更新缓存
sudo sh -c 'echo "/usr/local/lib64" > /etc/ld.so.conf.d/local-lib64.conf'
sudo ldconfig

# 编辑 .bashrc 或 .bash_profile 文件
nano ~/.bashrc

# 在文件末尾添加以下内容
# PKG_CONFIG_PATH 设置
export PKG_CONFIG_PATH=/usr/local/lib64/pkgconfig:$PKG_CONFIG_PATH

# LIBZIP_CFLAGS 和 LIBZIP_LIBS 设置
export LIBZIP_CFLAGS="-I/usr/local/include"
export LIBZIP_LIBS="-L/usr/local/lib64 -lzip"

# LD_LIBRARY_PATH 设置
export LD_LIBRARY_PATH=/usr/local/lib64:$LD_LIBRARY_PATH

# 使更改生效
source ~/.bashrc
Last modification:June 28, 2024
如果觉得我的文章对你有用,请随意赞赏