Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xcode 不同SSE版本的通用二进制文件_Xcode_Sse_Universal Binary - Fatal编程技术网

Xcode 不同SSE版本的通用二进制文件

Xcode 不同SSE版本的通用二进制文件,xcode,sse,universal-binary,Xcode,Sse,Universal Binary,我可以为Mac OS X创建一个通用二进制文件,其中包含我的应用程序的两个版本,一个使用SSE4.2编译,另一个使用SSE3编译 在这种情况下,我会自动加载使用SSE4.2编译的版本,以供支持SSE4.2的CPU使用 如果没有,我希望得到建议,在不支持SSE4.2的旧CPU上运行我的应用程序,但在支持SSE4.2的CPU上使用SSE4.2 请注意,我的目标是Mac AppStore,如果这有关系的话。 我在Xcode 4.5中使用Clang。Mach-O格式不支持这种格式,Mach-O格式由Ma

我可以为Mac OS X创建一个通用二进制文件,其中包含我的应用程序的两个版本,一个使用SSE4.2编译,另一个使用SSE3编译

在这种情况下,我会自动加载使用SSE4.2编译的版本,以供支持SSE4.2的CPU使用

如果没有,我希望得到建议,在不支持SSE4.2的旧CPU上运行我的应用程序,但在支持SSE4.2的CPU上使用SSE4.2

请注意,我的目标是Mac AppStore,如果这有关系的话。
我在Xcode 4.5中使用Clang。

Mach-O格式不支持这种格式,Mach-O格式由Mac OS X使用。这种格式允许不同体系结构的二进制文件。有一个子类型字段,但只有为不同代处理器定义的值,而不是它们的能力

有几种方法可以解决这个问题。一种是将SSE4.2和旧处理器的代码构建到同一个二进制文件中,使用不同的函数名。您的代码将确定是否支持SSE4.2,然后调用适当的函数

另一种选择是构建两个库,一个带SSE4.2,一个不带,并在应用程序包中提供这两个库,但不链接到它们。首次加载时,您的代码将确定是否支持SSE4.2,然后加载正确的库


使用第一种方法,您不必担心加载库和连接所有函数,但您将始终加载未执行的额外代码,并且您必须在每次调用这些函数之前检查一个变量。使用第二种方法,您可以简单地调用函数,而无需每次检查任何内容,但是加载库并连接所有函数比每次简单地比较一个变量要复杂得多。

您需要做的只是:1)检测指令集。2) 分支到所需的版本。
\uuu cpuid()
内在特性特定于MSVC。在GCC中,您可以使用内联程序集访问它。虽然我不确定你在用什么,但应该有办法访问它。我不喜欢更改源代码文件,因为一些无法在旧CPU上运行的代码行来自第三方开源项目。如果你不能更改源代码,那么你可能会倒霉,除非你1)找到一个编译器选项。或者2)构建一个包装器。这就是为什么我想用两个版本的应用程序制作一个通用二进制文件。这也有利于将ceil和floor等标准操作转换为第二版本上的SSE4.1指令。