编辑(2020 年 9 月 14 日):这似乎是一个 Xcode 错误,现已在 Xcode 12 beta 6 中修复。
我正在使用 Xcode 12 构建一个静态库,对于 tvOS,Xcode 12 包含arm64
和arm64e
单个胖库。
同样,在为模拟器构建时,Xcode 12 将x86_64
和arm64
(Mac Apple Silicon)都包含在一个胖库中。
在这两种情况下,我都无法使用以下命令创建包含这些库的 XCFramework:
xcodebuild -create-xcframework -output A.xcframework" -library A.a
尝试这样做会导致错误
error: unable to find any architecture information in the binary at 'A.a'
的输出lipo -info A.a
清楚地表明存在两种架构(分别为arm64
+arm64e
和arm64
+ x86_64
),所以我不明白为什么xcodebuild
不能识别和处理它。
我还尝试将各个架构分别提取到两个瘦文件中(例如A-arm64.a
和A-arm64e.a
),然后使用这些文件创建 XCFramework,但这会导致不同的错误:
Both tvos-arm64e and …
在 OSX 下的 OpenGL 应用程序中,渲染代码通常在 DisplayLink 线程上运行,该线程与主线程分开。
在后台执行任务(例如加载 GL 资源)时,同步线程非常重要,因此渲染线程不会尝试从后台线程正在主动更改的模型中进行绘制。
当渲染发生在主线程上时,我一直在使用 GCD 将后台任务的关键部分分派到主分派队列,如下所示:
dispatch_async(dispatch_get_main_queue(), ^{ [self doCriticalThing]; });
Run Code Online (Sandbox Code Playgroud)
但是,当渲染发生在 DisplayLink 线程上时,这不起作用,因为毫不奇怪,当 DisplayLink 尝试渲染时,我会在尝试运行关键任务的主线程之间遇到线程冲突。
是否可以使用 GCD 将任务分派到 DisplayLink 线程,而不是主线程?
或者我是否需要恢复使用类似的东西:
performSelector:onThread:withObject:waitUntilDone:
Run Code Online (Sandbox Code Playgroud)
直接将任务分配给DisplayLink线程?
尝试cmake
使用以下命令运行创建 Xcode 项目:
cmake -G Xcode ..
Run Code Online (Sandbox Code Playgroud)
它在 Xcode 13 及以下版本下完美运行。但在 Xcode 14 beta 下,如果突然失败,我会得到以下输出:
-- Found Git: /usr/bin/git (found version "2.32.1 (Apple Git-133)")
-- Found PythonInterp: /usr/local/bin/python3 (found suitable version "3.9", minimum required is "3")
-- The C compiler identification is unknown
-- The CXX compiler identification is unknown
CMake Error at CMakeLists.txt:17 (project):
No CMAKE_C_COMPILER could be found.
CMake Error at CMakeLists.txt:17 (project):
No CMAKE_CXX_COMPILER could be found.
Run Code Online (Sandbox Code Playgroud)
更多详细信息CMakeFiles/CMakeError.log
包括:
Compiling the C compiler identification …
Run Code Online (Sandbox Code Playgroud) 对于运行时生成的着色器代码,我感兴趣的是探索是否可以直接自动生成已编译的Metal Shader Language(MSL)代码(在.metallib
文件中找到并与该newLibraryWithData:error:
方法一起使用),而不是自动生成人类可读的MSL源代码(与该newLibraryWithSource:options:error:
方法一起使用)。
这样做的理由有两个:
文件中提供了有关已编译MSL代码格式的.metallib
文档吗?编译格式是特定于GPU的,还是作为中间语言格式存在,该newLibraryWithData:error:
方法在方法的最后编译阶段被带到GPU级别?