起始
服务器选用的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
是一个辅助工具,用于在编译和链接程序时方便地查找库文件及其相关信息。它主要用于解决依赖问题,使得编译和链接过程更加简洁和自动化。
主要功能
查找库文件
内容:库文件包含已编译的机器代码,可以直接被链接到最终的可执行程序中。
使用:在编译和链接阶段,链接器将源文件中调用的函数与库文件中的实现代码连接起来。
示例: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}
查找头文件路径
头文件通常包含函数声明、宏定义、类型定义和其他预处理指令。这些文件通常以 .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
3 comments
《盖世豪侠国语》香港剧高清在线免费观看:https://www.jgz518.com/xingkong/87260.html
怎么收藏这篇文章?
看的我热血沸腾啊