【发布时间】:2021-11-02 19:35:15
【问题描述】:
我有一个受 OSX 10.10 支持的项目。最近我不得不使用 Metal 框架进行图像处理。金属框架仅在 10.11 中引入。所以我的项目不会编译,因为部署目标是 10.10。我该如何克服这个?我不能在不更改部署目标的情况下添加#ifdef 或其他东西来编译项目并仅在最新的操作系统版本上使用 Metal 功能吗?
【问题讨论】:
我有一个受 OSX 10.10 支持的项目。最近我不得不使用 Metal 框架进行图像处理。金属框架仅在 10.11 中引入。所以我的项目不会编译,因为部署目标是 10.10。我该如何克服这个?我不能在不更改部署目标的情况下添加#ifdef 或其他东西来编译项目并仅在最新的操作系统版本上使用 Metal 功能吗?
【问题讨论】:
您可以使用此方法加载与动态加载的捆绑包相关的代码,例如插件或框架。
static NSBundle* _MetalBundle = nil;
static id<MTLDevice> _MetalDevice = nil;
static bool IsMetalSupported(int /*api*/)
{
_MetalBundle = [NSBundle bundleWithPath: @"/System/Library/Frameworks/Metal.framework"];
if (_MetalBundle)
{
[_MetalBundle load];
_MetalDevice = ((MTLCreateSystemDefaultDeviceFunc)::dlsym(dlopen(0, RTLD_LOCAL | RTLD_LAZY), "MTLCreateSystemDefaultDevice"))();
if (_MetalDevice)
return true;
}
[_MetalBundle unload];
return false;
}
【讨论】:
id 类型。我想调用一个方法并返回结果。我们通常导入 .h 文件来访问实例方法。但是对于捆绑包,文件不会暴露。