我在macOS上运行了一个命令行应用程序(蒙特雷,但这可能与此无关),它调用了一个使用OpenCL的库。当调用clGetDeviceIDs(..., CL_DEVICE_TYPE_GPU, ..., ...)
时,在OpenCL初始化过程中,会将一条消息打印为标准错误,全文如下:
2022-02-18 12:31:55.709016+0900 toktx[70551:23725709] [default] error finding potential wrapper bundle for node <FSNode 0x101a590a0> { isDir = ?, path = '<path to my app>' }: Error Domain=NSOSStatusErrorDomain Code=-10811 "kLSNotAnApplicationErr: Item needs to be an application, but is not" UserInfo={_LSLine=1579, _LSFunction=wrapperBundleNodeForWrappedNode}
这不是由库打印的,而是由OpenCL实现或macOS打印的。我正在使用macOS OpenCL框架。消息中提到的"LS“是LaunchServices。
然而,尽管消息初始化成功,但是将未来自被测试应用程序或库的消息打印到stderr将使跨平台CI测试更加困难。
我不想为我的命令行应用程序创建一个假包。还有其他方法来阻止OpenCL/系统抱怨吗?
发布于 2022-02-18 16:03:59
您可以尝试将一个Info.plist
直接嵌入到可执行二进制文件中。我不知道这是否会解决你的问题,但它确实允许程序更像一个应用程序。
在Xcode中,创建一个新的Info.plist文件,然后在命令行应用程序目标的Build中,需要将“创建二进制Info.plist节”设置设置为“是”,并在"Info.plist文件“设置中指定Info.plist的(本地)路径。
我认为在这个虚拟的Info.plist文件中不需要Info.plist;CFBundleIdentifier
、CFBundleVersion
和CFBundleShortVersionString
可能就足够了。
显然,这仍然没有给您的可执行文件一个实际的包装包,因此错误可能不会消失。
另一种选择是简单地将可执行文件作为虚拟包(New -> macOS -> Bundle)中的一个资源,用于实际重要的环境,而不是将其转换为一个完整的应用程序包。
https://stackoverflow.com/questions/71168389
复制相似问题