目录

KMP 和 XCode26

iOS 最近打包机已经升级 xcode26,突然出现了 kmp 相关的编译问题,包括一些头文件 not found 和 unresolved classifier 等等的问题

因为,我们的 kotlin/native 编译器基于 kotlin 2.0.21 做了魔改,用于支持鸿蒙系统,而且整个主工程的 kotlin 也没法轻易升级,所以直接升级 kotlin 2.2.20 官方支持的 xcode26 版本,短时间是不现实的

所以,需要想办法在 kotlin 2.0.21 的基础上支持 xcode26

Kuikly 写在前面

Tencent Kuikly Kotlin 已经适配 xcode26,如果没啥特殊需求定制的话,可以直接使用

https://github.com/Tencent-TDS/KuiklyBase-kotlin/commit/56b5c978e857dc9bcbccd4d66055b618fda7040e

作者说修改集中在 llvm 部分,但是 llvm 修改的部分似乎没有公开

猜测是他们需要编译一份独立的 llvm/clang 12.0.1,这个版本的 llvm 在 xcode26 的高版本的 clang 下编译是有问题的,所以需要修改

之前,我也基于 llvm 12.0.1 魔改了较多代码,让其可以在高版本的 clang 下编译通过

修改涉及了众多文件,如下:

/img/in-post/llvm_xcode26.jpg

但是,最终没敢用我自己魔改的 llvm(腾讯修改的 llvm 应该会比较靠谱…吧),原因是:

  1. 修改了很多神奇的地方,不确定正确性,不敢提交(对 llvm/clang 了解有限,很多地方借助 AI 辅助)
  2. 我们做了编译上的隔离,只有 ohos 才会使用到 llvm/clang 12,而其他的都还是 llvm 11.1.0,而且 xcode 其实也只是影响 apple 系的东西,所以也可以考虑修修补补 llvm 11.1.0 上遇到的问题

基于 llvm 11.1.0 适配 XCode26

警告
此方案不确定有没有潜在问题,不保证线上效果,也还没经过系统测试

既然想基于 llvm11.1.0 适配,那我们就看看到底在编译 kotlin/native 编译器的过程中有什么问题,并一个个解决

‘UIUtilities/UIDefines.h’ file not found

因为并不是 iOS 开发,搜索了一些文章和本地 sdk 后发现,UIUtilities 被移动到了 subframework

在 ClangArgs 中添加 -F path/to/SubFrameworks 解决

-lto_library library filename must be ’libLTO.dylib’

似乎是 toolchains 升级以后,linker 有变化?

总之,按照它的要求 -lto_library 后添加 libLTO.dylib

因为有多个地方的 build.gradle 有类似的写法

linkerOpts("-Xlinker", "-lto_library", "-Xlinker", "KT-69382")

// 修改为
linkerOpts("-Xlinker", "-lto_library", "-Xlinker", "$llvmDir/lib/libLTO.dylib")

modulemap 问题

类似如下报错

module '_c_standard_library_obsolete' requires feature XXXXX

包括 stddef.h 相关头文件中的 size_t 等等问题,似乎也是 clang feature 相关的问题,导致了 use_clang_def 的宏定义有问题,头文件不会被引入,或者高版本有了其他修改,就应该不被引入?

这块的修改不确定是否正确

因为 modulemap 中的 _c_standard_library_obsolete require 相关语句导致了编译报错,所以我将 modulemap 还原为了头文件引入的方式

大致就是根据 moduleName 和 modulemap 中的 header 文件,拼接为原本的头文件路径,如 XXXModule/XXX.h

这样以后,重新拼装 includes 传递给 buildNativeLibrary 即可绕过此问题

Accelerate.def 问题

这个我尝试修改了下,似乎是高版本多了个参数定义,但是不确定怎么传进去,或者说,具体传哪个值?

所以,干脆把这个模块 disable 掉,不进行 interop,绕过

总结

kotlin/native 的方案目前还是有很多问题,比如崩溃问题解决起来也是只能挠脑壳子,还要不停的适配 xcode,如果是国内团队还要适配鸿蒙

幸运的是,有腾讯帮忙做适配

所以,如果是小团队想试用,写写三段逻辑,建议直接用 kuikly 的 kotlin 编译器,同时,写 UI 的话,也有 Kuikly UI 和 ovCompose(支持 compose multiplatform 在鸿蒙上渲染)。如果是大团队,人力充足,那就自己卷吗

本人很不幸,团队人员稀少,还要卷这些东西,脑细胞已经死绝,后续打算直接投入 kuikly kotlin 编译器的怀抱好了