安装OpenCV 3.4.0时出现undefined reference错误求助
我明白你的困扰——找了一圈案例都是自定义代码编译时的undefined reference错误,结果自己在安装OpenCV 3.4.0的时候碰到了,还是在armv7l架构的Debian Stretch 9.3系统上,这种安装阶段的库链接问题确实少见。
你的错误出现在features2d模块编译时,链接/usr/lib/libgdal.so.20找不到对应符号,根源大概率是GDAL库版本和OpenCV 3.4.0的兼容性问题,或者cmake没有正确识别GDAL的库文件。下面给你几个针对性的解决方向:
1. 确认GDAL开发包是否安装完整
Debian Stretch默认的libgdal20可能只包含运行时库,缺少编译时需要的头文件和链接信息。先安装对应的开发包:
sudo apt-get update && sudo apt-get install libgdal-dev
安装完成后,回到OpenCV编译目录,清理之前的cmake缓存,重新配置编译:
make clean rm -rf CMakeCache.txt cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local .. make -j$(nproc)
2. 禁用GDAL依赖(如果不需要相关功能)
如果你的项目用不到OpenCV中依赖GDAL的影像处理功能,最简单的办法就是直接在cmake配置时关掉GDAL支持:
cmake -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_INSTALL_PREFIX=/usr/local \ -D WITH_GDAL=OFF \ ..
之后重新执行make clean && make -j$(nproc) && sudo make install,应该就能避开这个链接错误。
3. 手动指定GDAL库路径给cmake
有时候cmake会因为armv7l架构的特殊性,找不到正确的GDAL库位置。你可以手动指定GDAL的头文件和库路径:
cmake -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_INSTALL_PREFIX=/usr/local \ -D GDAL_INCLUDE_DIR=/usr/include/gdal \ -D GDAL_LIBRARY=/usr/lib/arm-linux-gnueabihf/libgdal.so.20 \ ..
注意/usr/lib/arm-linux-gnueabihf/是armv7l架构下系统库的标准路径,如果你之前改动过库位置,需要对应调整。
4. 手动编译兼容版本的GDAL
如果上面的方法都不行,说明系统自带的GDAL版本(Stretch里的libgdal20对应2.1.3)和OpenCV 3.4.0不兼容。你可以手动编译安装和OpenCV 3.4.0匹配的GDAL版本(比如2.2.x系列):
# 下载GDAL 2.2.4源码 wget http://download.osgeo.org/gdal/2.2.4/gdal-2.2.4.tar.gz tar xzf gdal-2.2.4.tar.gz cd gdal-2.2.4 # 编译安装到系统目录 ./configure --prefix=/usr/local make -j$(nproc) sudo make install # 刷新库缓存 sudo ldconfig
之后回到OpenCV编译目录,重新运行cmake和编译,cmake会自动识别到新安装的GDAL库。
内容的提问来源于stack exchange,提问作者Sean

