Linux C++编译错误<emmintrin.h>。

5

我正在尝试使用stb_image.h加载图像,但是在gcc提供的<emmintrin.h>版本中出现了两个编译器错误。我想可能需要某个编译器选项,但我还没有找到它是什么。

错误代码:

/usr/lib/gcc/x86_64-pc-linux-gnu/11.1.0/include/emmintrin.h:1230:10: error: the last argument must be an 8-bit immediate
 1230 |   return (__m128i)__builtin_ia32_pslldqi128 (__A, __N * 8);
      |          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/lib/gcc/x86_64-pc-linux-gnu/11.1.0/include/emmintrin.h:1224:10: error: the last argument must be an 8-bit immediate
 1224 |   return (__m128i)__builtin_ia32_psrldqi128 (__A, __N * 8);
      |          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

<emmintrin.h>中相关的代码:

extern __inline __m128i __attribute__((__gnu_inline__, __always_inline__, __artificial__))
_mm_srli_si128 (__m128i __A, const int __N)
{
  return (__m128i)__builtin_ia32_psrldqi128 (__A, __N * 8);
}

extern __inline __m128i __attribute__((__gnu_inline__, __always_inline__, __artificial__))
_mm_slli_si128 (__m128i __A, const int __N)
{
  return (__m128i)__builtin_ia32_pslldqi128 (__A, __N * 8);
}

编辑:

这与spdlog有关。我删除了所有的spdlog包含,并将我的日志宏更改为空,然后它成功编译。

最小可复现示例:

main.cpp

#include "pch.h"
#define STB_IMAGE_IMPLEMENTATION
#include "stb_image.h"

int main() {
    return 0;
}

pch.h:

#include <spdlog/spdlog.h>

cmakelists.txt:

cmake_minimum_required(VERSION 3.22)
project(untitled2)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_COMPILER /usr/bin/g++)

add_executable(untitled2 main.cpp stb_image.h pch.h)
target_precompile_headers(untitled2 PUBLIC pch.h)

add_subdirectory(spdlog)
target_link_libraries(untitled2 spdlog)

2
[mcve]请提供!作为一个新用户,在这里还请参观[tour]并阅读[ask]。 - Ulrich Eckhardt
如果你并不在乎那个糟糕的日志库究竟是如何损坏这些SSE2内部函数的,并且只想编译你的东西 - 尝试重构你的源代码,使得emmintrin.h(最好包括实现在内的完整的stb_image.h)在<spdlog.h>头文件之前被包含到你的CPP文件中。 - Soonts
1个回答

2
这种情况发生在您的程序没有使用优化编译,但是emmintrin.h正在选择优化版本的_mm_srli_si128_mm_slli_si128,因为fmt(spdlog的依赖项)定义了__OPTIMIZE__here
有关更多信息,请查看https://github.com/nothings/stb/discussions/1432#discussioncomment-4595273
可能的解决方法:
  1. 禁用预编译头文件以进行实现stb_image的翻译单元(例如,将其移动到另一个CMake目标(如果正在使用CMake))
  2. 取消定义实现stb_image的翻译单元中的__OPTIMIZE__
#if defined(__GNUC__) && !defined(NDEBUG) && defined(__OPTIMIZE__)
    #warning "Undefing __OPTIMIZE__ because of fmt"
    #undef __OPTIMIZE__
#endif

随意删除生成的警告信息。

但它应该被弹出。https://github.com/fmtlib/fmt/blob/master/include/fmt/core.h#L3005 - KamilCuk
1
GCC存在一个错误(https://gcc.gnu.org/bugzilla//show_bug.cgi?id=105120),如GitHub讨论中所述。 - OverShifted
1
包含解决方案/解决方法会提高答案的质量。 - M.M

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