如何用qcc QNX编译器编译OpenCV?编译报错求助
问题
我在Ubuntu 20.04.6系统上尝试用qcc QNX编译器编译OpenCV。按照OpenCV源码构建指南,原本的CMake构建命令是:
cmake -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=/usr/local \ -DINSTALL_C_EXAMPLES=ON \ -DINSTALL_PYTHON_EXAMPLES=ON \ -DOPENCV_GENERATE_PKGCONFIG=ON \ -DOPENCV_EXTRA_MODULES_PATH=~/opencv_build/opencv_contrib/modules \ -DBUILD_SHARED_LIBS=OFF \ -DBUILD_EXAMPLES=ON ..
我添加了指定qcc编译器的参数,修改后的命令为:
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=qcc -DCMAKE_CXX_COMPILER=qcc \ -DCMAKE_INSTALL_PREFIX=/usr/local \ -DINSTALL_C_EXAMPLES=ON \ -DINSTALL_PYTHON_EXAMPLES=ON \ -DOPENCV_GENERATE_PKGCONFIG=ON \ -DOPENCV_EXTRA_MODULES_PATH=~/opencv_build/opencv_contrib/modules \ -DBUILD_SHARED_LIBS=OFF \ -DBUILD_EXAMPLES=ON ..
但执行make(或Ninja)构建时出现大量错误和警告,最终失败,错误示例如下:
[ 13%] Building CXX object modules/ml/CMakeFiles/opencv_ml.dir/src/gbt.cpp.o /usr/bin/ld: /home/user/qnx710/target/qnx7/x86_64/lib/libc.so: warning: the use of `pthread_attr_setstackaddr' is deprecated, use `pthread_attr_setstack' /usr/bin/ld: /home/user/qnx710/target/qnx7/x86_64/lib/libc.so: warning: the use of `pthread_attr_getstackaddr' is deprecated, use `pthread_attr_getstack' [ 13%] Building CXX object modules/imgproc/CMakeFiles/opencv_imgproc.dir/src/accum.dispatch.cpp.o /usr/bin/ld: /home/user/qnx710/target/qnx7/x86_64/lib/libc.so: warning: The 'mktemp' function is dangerous. Use 'mkstemp' instead. /usr/bin/ld: CMakeFiles/opencv_version.dir/opencv_version.cpp.o: undefined reference to symbol '__printf_chk@@GLIBC_2.3.4' /usr/bin/ld: /lib/x86_64-linux-gnu/libc.so.6: error adding symbols: DSO missing from command line collect2: error: ld returned 1 exit status apps/version/CMakeFiles/opencv_version.dir/build.make:103: recipe for target 'bin/opencv_version' failed make[2]: *** [bin/opencv_version] Error 1 CMakeFiles/Makefile2:19706: recipe for target 'apps/version/CMakeFiles/opencv_version.dir/all' failed make[1]: *** [apps/version/CMakeFiles/opencv_version.dir/all] Error 2 [ 15%] Built target opencv_imgproc Makefile:165: recipe for target 'all' failed make: *** [all] Error 2
想知道如何正确用qcc QNX编译器编译该项目,或者有哪些更兼容qcc的开源项目?
解决方案
一、正确配置qcc编译OpenCV的关键步骤
从错误来看,核心问题是链接阶段混用了QNX的libc和Ubuntu系统的GLIBC,且qcc的CMake交叉编译配置不完整。以下是修正步骤:
- 创建QNX专属工具链文件
CMake需要明确交叉编译环境,不能仅指定编译器。新建qnx-toolchain.cmake文件,内容如下:
set(CMAKE_SYSTEM_NAME QNX) set(CMAKE_SYSTEM_VERSION 7.1.0) set(CMAKE_SYSTEM_PROCESSOR x86_64) # 指定QNX SDK路径 set(QNX_SDK_PATH "/home/user/qnx710") set(CMAKE_C_COMPILER "${QNX_SDK_PATH}/host/linux/x86_64/usr/bin/qcc") set(CMAKE_CXX_COMPILER "${QNX_SDK_PATH}/host/linux/x86_64/usr/bin/qcc") set(CMAKE_LINKER "${QNX_SDK_PATH}/host/linux/x86_64/usr/bin/ld") # 指定目标系统根目录 set(CMAKE_FIND_ROOT_PATH "${QNX_SDK_PATH}/target/qnx7/${CMAKE_SYSTEM_PROCESSOR}") # 限制查找范围到QNX目标环境 set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) # 添加qcc目标平台编译选项 add_compile_options(-Vgcc_ntox86_64) add_link_options(-Vgcc_ntox86_64)
然后在CMake命令中指定该工具链文件:
cmake -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_TOOLCHAIN_FILE=./qnx-toolchain.cmake \ -DCMAKE_INSTALL_PREFIX=/usr/local/qnx-opencv \ -DINSTALL_C_EXAMPLES=OFF \ -DINSTALL_PYTHON_EXAMPLES=OFF \ -DOPENCV_GENERATE_PKGCONFIG=ON \ -DOPENCV_EXTRA_MODULES_PATH=~/opencv_build/opencv_contrib/modules \ -DBUILD_SHARED_LIBS=OFF \ -DBUILD_EXAMPLES=OFF ..
注意:先关闭examples编译,QNX环境下的Python、GUI等依赖大概率缺失,优先保证核心库编译通过。
- 修复GLIBC符号缺失问题
错误中的__printf_chk是GLIBC特有符号,QNX libc不支持。在CMake中添加编译定义,强制使用标准printf:
# 在CMake命令中追加 -DCMAKE_CXX_FLAGS="-D__printf_chk=printf" \ -DCMAKE_C_FLAGS="-D__printf_chk=printf"
也可以直接把这行加到工具链文件里:
add_definitions(-D__printf_chk=printf)
- 清理旧构建目录
之前的构建目录已经混入Ubuntu系统配置,必须完全删除后重新执行CMake:
rm -rf build && mkdir build && cd build
二、兼容qcc的开源项目推荐
如果OpenCV的适配成本太高,以下项目对QNX/qcc的兼容性更好:
- libjpeg-turbo:轻量级JPEG编解码库,交叉编译流程简单,原生支持QNX
- SDL2:多媒体开发库,官方提供QNX编译文档,适合开发图形/多媒体应用
- Boost:大部分模块(容器、算法、线程等)可通过qcc编译,只需配置工具链
- OpenSSL:官方支持QNX平台,可编译出适配QNX的加密库
内容的提问来源于stack exchange,提问作者Gal Hadar
相关产品推荐
相关产品推荐

