g ++ inlined在调用always_inline“int _rdrand16_step()”时失败

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了g ++ inlined在调用always_inline“int _rdrand16_step()”时失败相关的知识,希望对你有一定的参考价值。

我在Windows上使用英特尔功能_rdrand16_step()编写了一个代码(Visual Studio 2017),但在Linux(g ++)上我无法正常工作。我在我的代码中调用了这个函数2次:

#include <immintrin.h>
...
unsigned short val = 0;
if (_rdrand16_step(&val))
...
_rdrand16_step(&val);
...

和g ++输出:

/usr/lib/gcc/x86_64-linux-gnu/8/include/immintrin.h: In member function ‘int otp_s7c::crypt(std::__cxx11::string, std::__cxx11::string, long long unsigned int)’:
/usr/lib/gcc/x86_64-linux-gnu/8/include/immintrin.h:129:1: error: inlining failed in call to always_inline ‘int _rdrand16_step(short unsigned int*)’: target specific option mismatch
 _rdrand16_step (unsigned short *__P)
 ^~~~~~~~~~~~~~
otp_s7c.cpp:139:24: note: called from here
      if (_rdrand16_step(&val))
          ~~~~~~~~~~~~~~^~~~~~
/usr/lib/gcc/x86_64-linux-gnu/8/include/immintrin.h:129:1: error: inlining failed in call to always_inline ‘int _rdrand16_step(short unsigned int*)’: target specific option mismatch
 _rdrand16_step (unsigned short *__P)
 ^~~~~~~~~~~~~~
otp_s7c.cpp:148:23: note: called from here
         _rdrand16_step(&val);
         ~~~~~~~~~~~~~~^~~~~~
答案

这是一个有点误导性的错误消息,源于你实际上并没有告诉编译器你的目标架构支持RDRAND指令(据我所知,这里的重要部分是“目标特定选项不匹配”部分)在末尾)。

-mrdrnd添加到编译器标志似乎可以解决问题。


比较一个Compiler Explorer qazxsw poi和qazxsw poi旗帜的例子

以上是关于g ++ inlined在调用always_inline“int _rdrand16_step()”时失败的主要内容,如果未能解决你的问题,请参考以下文章

inline函数和一般的函数有什么不同

GCC和C99标准中inline使用上的不同之处。inline属性在使用的时候,要注意以下两点:inline关键字在G

inline函数在IAR中的使用

错误:内联调用 always_inline 失败

内联函数:static inline 和 extern inline 的含义

C++基础--inline