在调用OpenCV做棋盘格角点检测时,会出现一些链接问题,记录如下:
如果用了cv::imread,必须链接opencv_imagecodes库,不然报以下错误
undefined reference to `cv::imread(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int)'
使用cv::findChessboardCorners、cv::cornerSubPix、以及cv::solvePnP必须链接 opencv_calib3d,不然报错如下:
libopencv_imgcodecs.so: undefined reference to `Imf_2_2::FrameBuffer::end()'
libopencv_imgcodecs.so: undefined reference to `Imf_2_2::InputFile::readPixels(int, int)'
undefined reference to `Imf_2_2::ChannelList::insert(char const*, Imf_2_2::Channel const&)'
...
需要链接opencv_calib3d
注意opencv_imagecodes依赖OpenEXR
如果版本不对会出错,Imf_2_2 表明需要2.2.0的版本,现提供安装方法如下
下载
git clone -b v2.2.0 https://github.com/AcademySoftwareFoundation/openexr.git
或
https://github.com/AcademySoftwareFoundation/openexr/archive/refs/tags/v2.2.0.zip
cd openexr-2.2.0/IlmBase/
mkdir build && cd build
cmake .. #可以指定第三方文件夹cmake .. -DCMAKE_INSTALL_PREFIX=~/project/third_dir/openexr/
make
sudo make install
cd openexr-2.2.0/OpenEXR
mkdir build && cd build
#记得修改CMakeLists.txt 不然会找不到half.h
#INCLUDE_DIRECTORIES(/home/project/third_dir/openexr/include/OpenEXR)
#link_directories(/home/project/third_dir/openexr/lib)
cmake .. #可以指定第三方文件夹cmake .. -DCMAKE_INSTALL_PREFIX=~/project/third_dir/openexr/
make
sudo make install
如果在编译时还是找不到链接,
错误提示是 ./dwaLookups: error while loading shared libraries: libIex-2_2.so.12: cannot open shared object file: No such file or directory。
记得使用以下命令查看是否生成链接
sudo find / -name "libIex-2_2.so.12"
如果能够找到
export LD_LIBRARY_PATH=/home/project/third_dir/openexr/lib/:$LD_LIBRARY_PATH
此时OpenEXR就安装成功了,如果安装文件夹是第三方,记得在自己项目CMakeLIst.txt里指定位置
include_directories(
/home/project/third_dir/openexr/include
)
link_directories(
/home/project/third_dir/openexr/lib
)
编译项目如果出现以下错误:
symbol lookup error: /home/third_party/opencv/lib/libopencv_imgcodecs.so.4.5: undefined symbol: ZN7Imf_2_214ChromaticitiesC1ERKN9Imath_2_24Vec2IfEES5_S5_S5
说明OpenCV 和 OpenEXR 库的版本不匹配,可能导致符号找不到,记得链接到自己的安装文件夹
export LD_LIBRARY_PATH=/home/project/third_dir/openexr/lib/:$LD_LIBRARY_PATH
对于openexr2.3.0及以上版本,安装方法如下
cd <source root>/IlmBase
./bootstrap
./configure --prefix=/mnt/Data/code/thirdparty/openexr
make
make install
cd <source root>/OpenExr
./bootstrap
./configure --prefix=/mnt/Data/code/thirdparty/openexr
make
make install
```