Qt结合OpenCV为树莓派4交叉编译时出现依赖及未定义引用错误
问题根源
undefined reference to std::random_device::_M_getentropy() const@GLIBCXX_3.4.25错误本质是交叉编译工具链的libstdc版本和树莓派sysroot中使用的libstdc版本不匹配:
- GLIBCXX_3.4.25对应GCC 8.x版本,若你主机的交叉编译器版本高于树莓派系统自带的GCC版本,编译时会链接高版本libstdc的独有符号,但sysroot内的低版本libstdc不存在该符号,就会触发报错
- 你主机安装的OpenCV 4.5不会影响当前编译:你的.pro配置已经明确指定了链接树莓派sysroot下的OpenCV 3.2库,只要路径配置正确,不会调用主机x86架构的OpenCV 4.5文件
解决步骤
- 先确认树莓派系统的libstdc++支持版本:
在树莓派终端执行命令strings /usr/lib/arm-linux-gnueabihf/libstdc++.so.6 | grep GLIBCXX,查看输出的最高版本号是否低于3.4.25。 - 替换交叉编译sysroot的libstdc++文件:
将树莓派/usr/lib/arm-linux-gnueabihf/目录下的libstdc++.so.6和libstdc++.a拷贝到主机交叉编译环境的对应路径../../Documents/Qt-CrossCompile-RaspberryPi/raspberrypi4/sysroot/usr/lib/arm-linux-gnueabihf/,覆盖原有高版本文件。 - 调整.pro编译配置(上述操作无效时使用):
- 可添加宏定义强制关闭getentropy相关实现,在.pro中插入:
QMAKE_CXXFLAGS += -D_GLIBCXX_USE_GETENTROPY=0- 若你的树莓派系统版本较旧(如Debian Stretch,对应GCC 6),不支持C++17的全部特性,可将.pro中的
CONFIG += c++17改为更低版本:
CONFIG += c++14- 也可添加静态链接libstdc++的配置,避免运行时动态链接出错:
QMAKE_LFLAGS += -static-libstdc++ - 清理项目后重新编译:
依次执行Qt Creator的「清理项目」-「运行qmake」-「重新构建」,验证报错是否消失。
内容的提问来源于stack exchange,提问作者Lolix Dudu
相关产品推荐
相关产品推荐

