KMM项目无法找到iOS Framework,Gradle同步报错求助
解决KMM无CocoaPods引入iOS Framework时的cinterop模块找不到问题
报错信息
- Gradle同步提示:
:shared:iosArm64Main: cinterop file: /Users/luis.garcia/Desktop/kmp-crash/shared/build/classes/kotlin/iosArm64/main/cinterop/shared-cinterop-luismafw.klib 不存在 - 伴随异常:
Exception in thread "main" java.lang.Error: /var/folders/h_/qb6wf4y90lz8c2blq8d3xbk80000gq/T/15310463132579371666.m:1:9: fatal error: module 'luismafw' not found
问题根源
- compilerOpts路径错误:
-F参数后应指向framework所在的父目录,而非framework文件本身; - .def文件配置缺失:未正确声明需要导入的iOS framework模块;
- 静态framework链接参数不全:静态库可能需要额外参数避免符号丢失。
修复步骤
1. 修正cinterop的compilerOpts路径
修改build.gradle.kts中cinterop的compilerOpts,将-F后的路径改为framework所在的父目录:
listOf( iosX64(), iosArm64(), iosSimulatorArm64() ).forEach { it.compilations.getByName("main") { val luismafw by cinterops.creating { defFile("src/nativeInterop/cinterop/luismafw.def") compilerOpts( "-framework", "luismafw", // 改为framework所在的父目录 "-F/Users/luis.garcia/Desktop/kmp-crash/iosApp/" ) } } // 其余配置保持不变 }
2. 完善.def文件内容
打开src/nativeInterop/cinterop/luismafw.def,添加模块声明(如果是模块化framework):
modules = luismafw
如果framework基于头文件暴露接口,补充头文件和路径配置:
headers = luismafw.h compilerOpts = -F/Users/luis.garcia/Desktop/kmp-crash/iosApp/
3. 调整静态framework的链接参数
在binaries.all的linkerOpts中添加-ObjC参数,确保静态库符号被正确链接:
it.binaries.all { linkerOpts( "-framework", "luismafw", "-F/Users/luis.garcia/Desktop/kmp-crash/iosApp/", "-ObjC" ) }
4. 清理缓存并重新构建
- 执行终端命令清理构建缓存:
./gradlew clean - 手动触发cinterop绑定生成:
./gradlew :shared:iosArm64MainCinteropLuismafw - 重新同步Gradle项目。
验证
在iosMain源码中导入framework并测试调用:
import luismafw.* // 调用framework中的方法/类 fun testFramework() { // 示例:LuismaFWClass.doSomething() }
内容的提问来源于stack exchange,提问作者LuisMa
相关产品推荐
相关产品推荐

