Clang编译报错:外部链接inline函数中使用static函数_mm_loadu_epi8
Clang下
_mm_loadu_epi8在外部链接内联函数中使用的报错解决方法 近期使用Clang编译器时遇到了GCC与MSVC均未出现的问题,报错信息如下:
test_newer.c:8:32: fatal error: static function '_mm_loadu_epi8' is used in an inline function with external linkage [-Wstatic-in-inline]
__m128i testing1 = _mm_loadu_epi8(a);
可复现问题的代码:
#include <stdio.h> #include <immintrin.h> #define __forceinline __attribute__((always_inline)) inline __forceinline void testing() { unsigned char a[16] = {3, 4, 2, 5, 3, 2, 1, 2, 5, 6, 7, 9, 10, 11, 3, 4}; __m128i testing1 = _mm_loadu_epi8(a); printf("Sample print\n"); } int main() { testing(); return 0; }
使用的编译命令:
clang -march=skylake-avx512 -O2 -c -Werror -Wall -Wextra -Wno-reserved-identifier -Weverything -Wfatal-errors test_newer.c -o file1
解决方案(保留所有编译标志)
以下几种方法可解决该问题:
将内联函数改为内部链接:把
__forceinline void testing()修改为static __forceinline void testing()。函数变为内部链接后,Clang不再触发该警告,同时always_inline属性仍能保证函数被强制内联。替换为外部链接的内置函数:使用Clang支持的
__builtin_ia32_loaddqu内置函数替代_mm_loadu_epi8,二者功能完全等价,且前者为外部链接,不会触发报错。修改后的代码行如下:__m128i testing1 = (__m128i)__builtin_ia32_loaddqu((void*)a);禁用特定警告:在代码开头添加
#pragma clang diagnostic ignored "-Wstatic-in-inline",或在编译命令中追加-Wno-static-in-inline参数。该方法仅抑制警告,建议优先选择前两种更规范的方案。
内容的提问来源于stack exchange,提问作者Srihari S
相关产品推荐
相关产品推荐

