在包含<emmintrin.h>时出现“SSE2指令集未启用”错误

5

我正在尝试使用cmake和make编译一些使用<emmintrin.h>头文件的C++代码,但是出现了以下错误:

 #error "SSE2 instruction set not enabled"

我有一颗Intel Celeron双核处理器,运行Linux(Mint)系统(内核3.5)。

根据维基百科,Celeron双核能够执行SSE2指令,并且根据/proc/cpuinfo设置sse2标志。但是这个问题的提问者提到了Intel Celeron的有限SSE支持。

我已经尝试在我的CMakeLists.txt中使用SSE编译选项:

set(CMAKE_C_FLAGS ${CMAKE_C_FLAGS} "-msse -msse2 -msse3")

..但是没有任何改变。 cmake . 运行良好,但 make 提示上述错误信息。

我是否需要更改CMakeLists.txt中的设置,或者Celeron Dual Core是否(完全)不支持SSE2?


是的,我的BIOS没有启用或禁用SSE的设置。 - Suzana
CMake和Make并不是一一对应的。如果您正在使用生成的Makefile进行编译,请确保它已经包含了SSE2标志。 - Arun
2
你尝试过使用 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -msse -msse2 -msse3") (注意引号的位置)或者 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse -msse2 -msse3") 吗? - Fraser
1
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse -msse2 -msse3") 可以正常工作!谢谢!你有任何想法为什么会这样吗?请把你的评论发布为答案,这样我就可以接受它了... - Suzana
你正在包含错误的文件!请查看我在类似主题中的答案 - TrueY
1个回答

6

您需要调用

set(CMAKE_C_FLAGS ${CMAKE_C_FLAGS} "-msse -msse2 -msse3")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse -msse2 -msse3")

CMAKE_C_FLAGS 适用于 C 文件,从您的文章中的 C++ 标签可以猜测您正在编译 C++ 文件,因此需要改变 CMAKE_CXX_FLAGS

至于引号的位置,在您原来的版本中,您将 CMAKE_C_FLAGS 设置为包含两个独立条目,第一个是 CMAKE_C_FLAGS 的起始值,第二个是字符串 "-msse -msse2 -msse3"

CMake 将这样的列表保留为分号分隔的条目。在 CMAKE_<lang>_FLAGS 的情况下,它们无疑是由包含所有所需标志的字符串组成的单个值。


这拯救了我的一天。非常感谢你。(尝试在Hadoop上构建BWA)。 - Jirapong
有没有一种可移植的方法来做到这一点?特别是在现代CMake中,例如基于目标的方式,您不应该操作全局CXX标志。这似乎是现在行不通的方法。 - johnb003

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接