我可以为 Mac OS X 创建一个通用二进制文件,其中包含我的应用程序的两个版本,一个是用 SSE4.2 编译的,一个是用 SSE3 编译的?
在这种情况下,我会为支持 SSE4.2 的 CPU 自动加载使用 SSE4.2 编译的版本。
如果不是,我想获得建议,以在不支持 SSE4.2 但在支持它的 CPU 上使用 SSE4.2 的旧 CPU 上运行我的应用程序。
请注意,我的目标是 Mac AppStore,如果有的话。我在 Xcode 4.5 中使用 Clang。
我可以为 Mac OS X 创建一个通用二进制文件,其中包含我的应用程序的两个版本,一个是用 SSE4.2 编译的,一个是用 SSE3 编译的?
在这种情况下,我会为支持 SSE4.2 的 CPU 自动加载使用 SSE4.2 编译的版本。
如果不是,我想获得建议,以在不支持 SSE4.2 但在支持它的 CPU 上使用 SSE4.2 的旧 CPU 上运行我的应用程序。
请注意,我的目标是 Mac AppStore,如果有的话。我在 Xcode 4.5 中使用 Clang。
Mac OS X 使用的 Mach-O 格式不支持这一点。该格式允许二进制文件用于不同的体系结构。有一个子类型字段,但只有为不同代处理器定义的值,而不是它们的能力。
有几种方法可以解决这个问题。一种方法是将 SSE4.2 和旧处理器的代码内置到相同的二进制文件中,使用不同的函数名称。您的代码将确定是否支持 SSE4.2,然后调用正确的函数。
另一种选择是构建两个库,一个使用 SSE4.2,一个不使用,并将它们都发送到您的应用程序包中,但不链接到它们。首次加载时,您的代码将确定是否支持 SSE4.2,然后加载正确的库。
使用第一种方法,您不必担心加载库和连接所有函数,但您总是会加载未执行的额外代码,并且您必须在每个函数调用之前检查一个变量. 使用第二种方法,您可以简单地调用函数,而无需每次都检查任何内容,但是加载库并连接所有函数比每次都简单地比较一个变量需要更多的工作。