自定义Qt编译OpenCV加载xcb插件失败求助
解决自定义Qt编译OpenCV后的xcb插件加载失败问题
从你的调试日志里能明确看到问题根源:你的conda环境里自带了Qt 5.9.7,而你编译OpenCV用的是手动安装的Qt 5.14.0,两套不同版本的Qt库冲突,导致xcb插件加载时出现符号未定义错误。下面是针对性的解决方案:
方案一:强制让OpenCV使用手动安装的Qt 5.14
这个方案不需要修改conda环境,只需要在运行脚本时指定正确的Qt库路径和插件路径:
临时生效(每次运行前执行):
# 优先加载Qt5.14的库 export LD_LIBRARY_PATH=/opt/Qt5.14.0/5.14.0/gcc_64/lib:$LD_LIBRARY_PATH # 指定Qt平台插件的路径为Qt5.14自带的插件 export QT_QPA_PLATFORM_PLUGIN_PATH=/opt/Qt5.14.0/5.14.0/gcc_64/plugins/platforms # 然后运行你的Python脚本 python your_script.py永久生效(写入conda环境的激活脚本):
- 先创建conda环境的激活脚本目录:
mkdir -p ~/.conda/envs/py36/etc/conda/activate.d mkdir -p ~/.conda/envs/py36/etc/conda/deactivate.d - 创建激活时的环境变量脚本
~/.conda/envs/py36/etc/conda/activate.d/env_vars.sh:export LD_LIBRARY_PATH=/opt/Qt5.14.0/5.14.0/gcc_64/lib:$LD_LIBRARY_PATH export QT_QPA_PLATFORM_PLUGIN_PATH=/opt/Qt5.14.0/5.14.0/gcc_64/plugins/platforms - 创建退出环境时恢复的脚本
~/.conda/envs/py36/etc/conda/deactivate.d/env_vars.sh:unset LD_LIBRARY_PATH unset QT_QPA_PLATFORM_PLUGIN_PATH
之后每次激活py36环境时,这些变量会自动生效,运行OpenCV脚本就不会有冲突了。
- 先创建conda环境的激活脚本目录:
方案二:统一conda环境的Qt版本为5.14
如果你不想隔离库路径,可以把conda环境里的Qt换成和编译OpenCV一致的版本:
- 先卸载现有Qt和PyQt:
conda remove -y pyqt qt - 通过conda-forge源安装Qt5.14(conda默认源可能没有这个版本):
conda install -c conda-forge qt=5.14 pyqt=5.14 - 重新检查OpenCV的软链接是否指向正确的编译产物,或者重新编译一次OpenCV(确保链接到conda环境的Qt5.14)。
方案三:用conda环境的Qt重新编译OpenCV
如果不想手动维护Qt版本,直接用conda环境里的Qt来编译OpenCV,从根源避免冲突:
修改你的cmake命令,把CMAKE_PREFIX_PATH指向conda环境的Qt库路径:
cmake -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_INSTALL_PREFIX=/opt/OpenCV/opencv-3.4.9 \ -D CMAKE_PREFIX_PATH="/home/w/.conda/envs/py36/lib/cmake;/opt/vtk-8.2.0/lib/cmake;/opt/g2o/lib/cmake" \ -D OPENCV_EXTRA_MODULES_PATH=/home/w/OpenCV/opencv-3.4.9/opencv_contrib-3.4.9/modules \ -D PYTHON3_EXECUTABLE=/home/w/.conda/envs/py36/bin/python3 \ -D WITH_OPENGL=ON \ -D WITH_V4L=ON \ -D WITH_LIBV4L=ON \ -D WITH_FFMPEG=ON \ -D WITH_VTK=ON \ -D WITH_QT=ON \ -D WITH_GTK=ON \ ..
编译完成后,重新创建cv2.so的软链接到conda环境,这样OpenCV会直接链接conda里的Qt5.9.7,不会出现版本冲突。
内容的提问来源于stack exchange,提问作者IgNite
相关产品推荐
相关产品推荐

