升级Ubuntu后C++内置头文件opt_random.h编译报错如何解决?
问题根因分析
- 你单独引入
opt_random.h的测试不具备参考性:执行头文件追踪命令时没有添加-march=native参数,默认不会定义__SSE3__宏,因此不会触发引入pmmintrin.h的逻辑,和实际编译环境不一致。 opt_random.h是C++标准库<random>的内部实现头文件,设计上不允许开发者直接引用,所有依赖的前置定义都由外层的<random>头文件准备。实际编译报错,说明<random>引入时缺少SSE相关类型的前置定义,最常见的原因是代码中#include <random>之前的内容意外undef了__SSE3__宏,或是引入的第三方头文件破坏了标准库的依赖环境。
解决方案
- 方案1(最稳妥):修改你的代码,在
#include <random>之前先引入<pmmintrin.h>头文件,手动补充SSE3相关类型和函数的定义,修复依赖缺失问题。 - 方案2:在编译参数中额外加入
-msse3参数,强制开启SSE3支持,确保__SSE3__宏在整个编译周期内有效,修改后的编译命令参考:
/usr/bin/c++ -Wall -g0 -O3 -DNDEBUG -march=native -msse3 -pthread -std=gnu++11 -o CMakeFiles/mypath/myfilename.cpp.o -c /home/mypath/myfilename.cpp
- 方案3:如果不需要用到标准库随机数的优化实现,可以在引入
<random>之前定义_GLIBCXX_USE_RANDOM_TR1=1宏,强制使用旧版无SSE优化的随机数实现,绕过该问题。 - 可选排查项:检查
#include <random>之前的所有代码,确认是否存在#undef __SSE3__之类的语句,如果有直接删除即可从根源解决问题。
内容的提问来源于stack exchange,提问作者Corey A. Henderson
相关产品推荐
相关产品推荐

