libjpeg是一个广泛使用的开源库,用于处理JPEG(Joint Photographic Experts Group)图像格式的编码、解码、压缩和解压缩功能,是许多图像处理软件和库的基础。
libjpeg本身的构建没什么特别的,不过值得说道的是libjpeg存在一个高性能分支叫做libjpeg-turbo,通过汇编代码使用SIMD(Single Instruction, Multiple Data)指令集(如 MMX、SSE2、AVX2 等),可以显著加快JPEG图像的压缩和解压缩速度。据说在同样的硬件环境下,libjpeg-turbo的速度通常是libjpeg的2到6倍。
libjpeg的一个经典版本是v6b,libjpeg-turbo对这个版本保持了API兼容性,因此可以作为libjpeg的直接替代品,而无需对现有代码进行修改。libjpeg-turbo对于v7,v8只是做到了部分兼容,但是其实libjpeg目前已经发展到v9了。笔者个人认为libjpeg和libjpeg-turbo是C语言实现的,接口比较稳定,这个兼容性还是可以保证的。另外,jpeg的格式也固定很久了改动也不太大,估计也不上版本太高的功能,因此还是决定使用libjpeg-turbo。
构建libjpeg-turbo的关键指令如下所示:
# 配置CMake
cmake .. -G "$Generator" -A x64 -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_INSTALL_PREFIX="$InstallDir" -DENABLE_STATIC=off# 构建阶段,指定构建类型
cmake --build . --config RelWithDebInfo# 安装阶段,指定构建类型和安装目标
cmake --build . --config RelWithDebInfo --target install
除了ENABLE_STATIC是libjpeg-turbo自定义的构建选项,其他指令和构建选项本系列其他几篇博文都介绍过。不过有一点需要提示一下,libjpeg-turbo编译用到了汇编语言,因此需要指定一个汇编语言编译器NASM,只要是安装在默认目录就能够自动识别:
当然,不需要NASM也能构建成功,不过libjpeg-turbo就不能得到最佳的性能优化了。