如何在没有root权限的linux服务器上构建libvips

由于最近用到的一个项目依赖于pyvips,而pyvips的使用又依赖于C语言库libvips,因此在使用该项目前必须现在服务器上安装libvips。但是实验室的服务器没有提供root权限,无法通过apt-get直接安装,因此只能通过源代码进行构建。折腾了一天终于弄的差不多了,这里记录一下整个过程。

依赖安装

libvips的安装依赖于以下四个库:build-essential, pkg-config, libglib2.0-dev, libexpat1-dev,其中build-essential和是服务器本来就有的,那么需要安装的主要是后面三个。本来想问GPT如何通过源代码构建,但是GPT提供了一个更便捷的方案,即使用conda进行安装,不过使用conda安装的话就只能在当前环境下才能使用,但是我目前只有一个项目用得到,所以就直接用conda安装了。安装命令分别为:

bash 复制代码
conda install pkg-config
conda install expat
conda install glib

安装完以后使用pkg-config应该可以查到后面两个库:

bash 复制代码
pkg-config --cflags --libs glib-2.0
pkg-config --cflags --libs expat

除了上面四个必须的依赖外,vips还需要安装一些可选的依赖,主要作用是为不同格式的图片提供支持,比如libjpeg,libexif,librsvg

这里我只安装了libjpeg,由于无法直接使用conda安装,因此就必须要下载源代码然后自己构建了,主要命令如下:

bash 复制代码
wet http://www.ijg.org/files/jpegsrc.v9d.tar.gz
tar -xzf jpegsrc.v9d.tar.gz
cd jpeg-9d
./configure --prefix=/path/to/prefix #这个路径是自己指定的
make
make install

安装完成后,我们将libjpeg添加进环境变量:

bash 复制代码
vim ~/.bashrc

在最后添加:

bash 复制代码
export JPEG_HOME="/path/to/prefix"
export PATH=$PATH:$JPEG_HOME/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$JPEG_HOME/lib/

保存后执行

bash 复制代码
source ~/.bashrc
cjpeg -v #检查是否安装成功

构建工具安装

libvips使用的构建工具是meson,而非cmake,而meson又依赖于ninja,因此我们还需要安装meson和ninja。

其中meson可以直接通过pip下载:

bash 复制代码
pip install meson

ninja可以直接在github的发行页面下载:github.com/ninja-build...,由于实验室服务器是arm64架构的,因此我下载的是ninja-linux-aarch64.zip

上传到服务器的合适目录下后使用unzip解压,并将其添加进环境变量,具体操作这里不再赘述。

vips构建

这一步主要参考官方文档,首先在github发行页面下载对应版本的vips,我下载的是最新版vips-8.15.3.tar.xz,上传到服务器后解压并构建,下面的命令复制自官方文档:

bash 复制代码
tar xf libvips-x.y.z.tar.gz
cd libvips-x.y.z
meson setup build-dir --prefix=/aaa/bbb/ccc
cd build-dir
ninja
ninja test
ninja install

如果顺利的话应该会在/aaa/bbb/ccc目录下成功构建vips,源文件最好不要删除,因为后面如果要补充依赖的话需要重新构建。

下面仍然是将vips添加进环境变量:

bash 复制代码
export VIPS_HOME="/path/to/prefix"
export PATH=$PATH:$VIPS_HOME/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$VIPS_HOME/lib/x86_64-linux-gnu/

保存后执行:

bash 复制代码
source ~/.bashrc

安装并测试pyvips

通过pip安装pyvips:

bash 复制代码
pip install pyvips

通过如下代码验证pyvips能否查找并成功调用libvips

python 复制代码
import pyvips
​
image = pyvips.Image.new_from_file('some-image.jpg', access='sequential')
image *= [1, 2, 1]
mask = pyvips.Image.new_from_array([
    [-1, -1, -1],
    [-1, 16, -1],
    [-1, -1, -1],
], scale=8)
image = image.conv(mask, precision='integer')
image.write_to_file('x.jpg')

如果能成功执行得到x.jpg,说明安装成功。

重新构建vips

当需要vips读取其他类型的文件时,我们需要安装新的依赖,安装之后需要重新构建vips,重构和第一次构建的步骤略有不同,主要操作如下:

bash 复制代码
tar xf libvips-x.y.z.tar.gz
cd libvips-x.y.z
rm -rf ./build-dir
meson setup build-dir --prefix=/aaa/bbb/ccc --reconfigure
cd build-dir
ninja
ninja test
ninja install

问题

在构建libvips的过程中主要遇到了如下几个问题:

  1. 在第一次执行测试代码时,尽管已经安装了libvips,但是pyvips仍然无法找到对应的动态库,报错:

    OSError: cannot load library 'libvips.so.42': libvips.so.42: cannot open shared object file: No such file or directory.

    后面发现由于libvips没有安装到系统指定的位置,因此无法查找到,需要在环境变量中添加

    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$VIPS_HOME/lib/x86_64-linux-gnu/

  1. 在最开始安装依赖时,由于系统里已经安装了全局的pkg-config,因此我就没有使用conda安装。但是使用全局的pkg-config是无法找到在conda环境中安装的库的,在构建vips时会报错:

    meson.build:57:11: ERROR: Dependency "glib-2.0" not found, tried pkgconfig

    因此需要使用conda安装pkg-config

  2. 在添加新的依赖后重新构建vips,构建过程中会提示Run-time dependency libjpeg found: NO (tried pkgconfig and cmake),即无法查找到新安装的依赖,这里需要将之前生成的build-dir文件删除再重新执行meson setup进行构建。

  3. 执行完source ~/.bashrc后conda环境会回到bash,注意重新切换环境。

相关推荐
是安迪吖1 分钟前
nfs服务器
运维·服务器
鱼骨不是鱼翅3 分钟前
模拟回显服务器
运维·服务器
EasyCVR41 分钟前
ISUP协议视频平台EasyCVR视频设备轨迹回放平台智慧农业视频远程监控管理方案
服务器·网络·数据库·音视频
Elastic 中国社区官方博客1 小时前
使用真实 Elasticsearch 进行更快的集成测试
大数据·运维·服务器·数据库·elasticsearch·搜索引擎·集成测试
PcVue China5 小时前
PcVue + SQL Grid : 释放数据的无限潜力
大数据·服务器·数据库·sql·科技·安全·oracle
舞动CPU7 小时前
linux c/c++最高效的计时方法
linux·运维·服务器
钰@8 小时前
小程序开发者工具的network选项卡中有某域名的接口请求,但是在charles中抓不到该接口
运维·服务器·小程序
wanhengwangluo8 小时前
云服务器和物理服务器的区别有哪些?
运维·服务器
扣得君10 小时前
C++20 Coroutine Echo Server
运维·服务器·c++20
keep__go10 小时前
Linux 批量配置互信
linux·运维·服务器·数据库·shell