【发布时间】:2021-06-01 19:22:36
【问题描述】:
我是 Xcode 的新手,在 macOS Catalina 10.15.7 上使用 Xcode 12.4 (12D4e) 为 macOS 开发 SIMD(SSE/AVX) 代码。
这段非常简单的代码可以在Debug方案中编译:
#include <immintrin.h>
int main(int argc, const char * argv[]) {
return 0;
}
但在发布方案中,标头出错:“函数调用的参数太少,预期为 2,有 0”对于这行“mmintrin.h”。
__builtin_ia32_emms();
如何在 Release 方案中编译它?
【问题讨论】:
-
这很奇怪;
emms指令不采用任何操作数,而 GCC 对_mm_empty()的定义确实使用了__builtin_ia32_emms(),没有您期望的 args。我的 Linux 桌面上的mmintrin.h的主线(不是 Apple)clang 11.0 版本也是如此。 IDK 为什么 clang 会期望 2 个参数。 -
你确定你有相同的设置吗?
CLANG_X86_VECTOR_INSTRUCTIONS用于调试和发布版本? -
@PaulR:MMX 是 x86-64 的基线,这个错误似乎与
__builtin函数有关,不是一个仅由标头有条件地定义的内在函数。 (如果您使用-mno-mmx,则此类内置函数将报告由于特定于目标的选项而内联失败,但我认为这不能解释期望此内置函数采用 2 个参数。)当然,我不使用 MacOS 或Xcode,所以我不能排除产生这些症状的问题的可能性,但这似乎不太可能。 (如果该错误消息被正确引用,那么其他任何事情也没有任何意义。) -
@PeterCordes:是的,我知道这没有意义,但我最近在 Xcode 项目中遇到了类似的奇怪问题。不幸的是,我不记得细节或修复,但我记得调试和发布构建设置之间存在一些差异。
-
是的,我认为这与我升级到 Xcode 12 时遇到的问题相同 - Debug 构建默认为当前架构,但 Release 构建尝试构建一个“胖”二进制文件x86 和 ARM 代码,因此如果您有任何特定于 x86 的代码(例如 Intel 内部函数),那么它在构建的 ARM 部分会失败。不幸的是,由此产生的错误消息具有误导性,因此乍一看问题并不明显。
标签: c++ xcode x86-64 simd intrinsics