即使包含头文件,_mm_shuffle_ps也没有声明

_mm_shuffle_ps not declared even though header included

本文关键字:ps 声明 shuffle mm 包含头 文件      更新时间:2023-10-16

有时(并非总是)当我在项目中包含我的数学头时,编译器会抱怨(尝试过gcc和clang) _mm_shuffle_ps_mm_shuffle_pd没有声明,即使所有编译器标志都设置(-msse -msse2 -msse3)并且包含正确的头(<x86intrin.h>)。

下面是我使用这些函数的方法:
extern "C"{
    #include <x86intrin.h>
}    
template<typename T>
struct sse_type;
template<>
struct sse_type<float>{
    typedef __m128 type;
    constexpr static type(&shuffle)(type, type, int) = _mm_shuffle_ps;
    // other sse functions
};
template<>
struct sse_type<double>{
    typedef __m128d type;
    constexpr static type(&shuffle)(type, type, int) = _mm_shuffle_pd;
    // other sse functions
};

然后我在这些类上定义了一堆操作符重载,以方便使用。

这就是我使用这些函数的方式,因为编译器不会抱怨在这些类中定义的任何其他sse函数。

记住编译器并不总是抱怨这个,有些项目用这个头编译得很好,我在这里到底做错了什么?或者这是一个编译器错误?

在问完这个问题后几乎马上就明白了(尽管我已经试图弄清楚这个问题几个小时了)

如果没有设置优化标志,GCC将从编译中发出一些sse函数。奇怪。

-O3添加到我的编译标志中就可以了。

所以我仍然在clang中得到错误,但在gcc 4.8中设置-O3修复了错误:/