ubuntu20.04 编译安装早期版本(如2.2.1)的OpenEXR
在一些slam问题相关的源码编译时,往往需要OpenEXR。有一些SOTA的slam相关工作是比较早期完成的,当时依赖的OpenEXR版本可能比较早。本文介绍如何在较新的系统下自行编译安装老版本OpenEXR。
apt 安装存在的问题
对于比较新的系统,apt很可能是找不到老版本库的。
apt 安装openexr可以直接通过:
sudo apt install libopenexr-dev
得到。但是一般是比较新的版本,比如ubuntu 20.04会安装2.3.0版本的openexr。
老版本的经过个人尝试,无法通过指定版本号、更换apt源等操作实现。
自己编译安装
release版本的openexr源码可以在这里下载,要注意源码与编译后库文件的匹配。
以 libIlmImf库为例,其动态链接库的命名是 libIlmImf-a_b.so.xx这里a_b是大版本号,xx是小版本号。例如2.2.0的源码编译后得到libIlmImf-2_2.so.22, 而2.2.1编译后得到libIlmImf-2_2.so.23。要弄清楚需要编译后的库文件的版本。
首先下载源码的压缩包并解压。openexr的github上有一份相关教程但是适用于新版本的源码,对于之前版本源码,其文件结构与编译方式并不相同。
以我安装的openexr-2.2.1为例,解压后目录结构如下:
这里我本来是直接进入OpenEXR进行编译,但是出现了 无法找到 “half.h” 的错误。
实际上我们需要先编译IlmBase。
需要的依赖在这里有说明,主要就是编译器要兼容C++11,Zlib,cmake>=3.10这样。
编译安装过程
编译 IlmBase
第一步进入 IlmBase 目录,可以看到这里有CMakeList.txt,我们可以在此处新建一个build目录(其他地方也可以,这里比较容易找到)并进入这个目录
mkdir build
cd build
在这里运行cmake
cmake ..
参数是CMakeList.txt所在的目录,请根据实际情况自行修改。
成功后运行
make
接着运行
sudo make install
这里要加sudo是因为这个库默认会把编译后的库的库文件以及头文件放在/usr/local/lib以及/usr/local/include里面,不加sudo是没有权限的。而且按照Ubuntu文件结构,一般自行编译的库确实是放在/usr/local中。
成功后就可以在/usr/local/lib找到libIlm*开头的so文件和la文件,分别是动态链接与静态库。此时可以核对一下库的版本是否是所需。同时在/usr/local/include/OpenEXR目录下找到头文件。
编译OpenEXR
接下来编译OpenEXR。
同样进入到解压后的OpenEXR目录,在这里我们也可以找到CMakeList.txt文件,要注意这里我们需要修改一下这个CMakeList.txt。
原因是本模块编译依赖于 half.h头文件,而这个头文件在刚刚编译IlmBase 时被放在/usr/local/include/OpenEXR里面了。
所以打开这里的CMakeList.txt,添加一行:
INCLUDE_DIRECTORIES(/usr/local/include/OpenEXR)
然后类似的,新建build目录并编译安装:
mkdir build
cd build
cmake ..
make
sudo make install
安装完成即可。
在安装时命令行会提示将运行时路径修改为/usr/local/lib等我们安装时预设的路径。这意味着安装后有可能不需要额外设置环境变量或修改依赖此库的其他项目的编译参数。当然如果遇到安装成功但安装后续依赖此库的项目是找不到文件,那可能还需要对路径加以配置。
以上就是在Ubuntu20.04下手动编译比较老版本OpenEXR的过程。希望对大家有所帮助。