【问题标题】:#error "SSE2 instruction set not enabled" when including <emmintrin.h>#error "SSE2 指令集未启用" 包含 <emmintrin.h>
【发布时间】:2013-04-30 21:09:28
【问题描述】:

我正在尝试使用 cmake 编译一些 C++ 代码,并使用包含 &lt;emmintrin.h&gt; 的 make 并得到以下 make 错误:

 #error "SSE2 instruction set not enabled"

我有一个带有 Linux (Mint) 系统(内核 3.5)的 Intel Celeron Dual Core 处理器。

根据维基百科,赛扬双核能够执行 SSE2 指令,并且 sse2 标志根据/proc/cpuinfo 设置。但是this question 的作者提到了英特尔赛扬对 SSE 的有限支持。

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

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

..但没有任何改变。 cmake . 工作正常,但 make 给出了上面的错误消息。

我必须更改 CMakeLists.txt 中的设置还是赛扬双核根本不(完全)支持 SSE2?

【问题讨论】:

  • 您检查过您的 BIOS 设置吗? techarp.com/showfreebog.aspx?lang=0&bogno=259
  • 是的,我的 BIOS 没有启用或禁用 SSE 的设置。
  • cmake 和 make 不是一对一的映射。如果您使用生成的 makefile 进行 make,请确保它已包含这些 SSE2 标志。
  • 你试过set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -msse -msse2 -msse3")(注意引号的位置)还是set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse -msse2 -msse3")
  • set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse -msse2 -msse3") 有效!谢谢!你知道为什么吗?请发表您的评论作为答案,以便我接受...

标签: c++ linux cmake intel sse2


【解决方案1】:

你需要打电话

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 设置为包含 2 个单独的条目,第一个是 CMAKE_C_FLAGS 的起始值,第二个是字符串 "-msse -msse2 -msse3"

CMake 将这样的列表保存为分号分隔的条目。在CMAKE_&lt;lang&gt;_FLAGS 的情况下,它们总是由包含所有必需标志的字符串组成的单个值。

【讨论】:

  • 这可以节省我的时间。太感谢了。 (尝试在 hadoop 上构建 bwa)。
  • 有便携的方法吗?尤其是在现代 CMake 中,例如基于目标的地方,您不应该操纵全局 CXX 标志。现在这似乎是错误的做法。
猜你喜欢
  • 2021-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-27
  • 2010-12-01
  • 2013-01-31
  • 1970-01-01
相关资源
最近更新 更多