• 作者:老汪软件技巧
  • 发表时间:2024-09-25 07:00
  • 浏览量:

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

依赖安装

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

conda install pkg-config
conda install expat
conda install glib

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

pkg-config --cflags --libs glib-2.0
pkg-config --cflags --libs expat

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

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

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添加进环境变量:

vim ~/.bashrc

在最后添加:

export JPEG_HOME="/path/to/prefix"
export PATH=$PATH:$JPEG_HOME/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$JPEG_HOME/lib/
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:$JPEG_HOME/lib/pkgconfig

保存后执行

source ~/.bashrc
cjpeg -v #检查是否安装成功

构建工具安装

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

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

pip install meson

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

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

vips构建

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

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添加进环境变量:

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/

保存后执行:

source ~/.bashrc

安装并测试pyvips

通过pip安装pyvips:

pip install pyvips

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

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,重构和第一次构建的步骤略有不同,主要操作如下:

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的过程中主要遇到了如下几个问题:

在第一次执行测试代码时,尽管已经安装了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/

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

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

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

在添加新的依赖后重新构建vips,构建过程中会提示Run-time dependency libjpeg found: NO (tried pkgconfig and cmake),即无法查找到新安装的依赖,这里需要在.bashrc中添加export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:$JPEG_HOME/lib/pkgconfig以确保pkg-config能够找到该库,然后将之前生成的build-dir文件删除再重新执行meson setup进行构建。

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