由于最近用到的一个项目依赖于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的过程中主要遇到了如下几个问题:
-
在第一次执行测试代码时,尽管已经安装了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)
,即无法查找到新安装的依赖,这里需要将之前生成的build-dir
文件删除再重新执行meson setup
进行构建。 -
执行完
source ~/.bashrc
后conda环境会回到bash,注意重新切换环境。