问题描述
我正在尝试为框架添加 cinterop。
我的 def 文件看起来像
language = Objective-C
modules = ModuleName
linkerOpts = -framework ModuleName
失败并显示错误消息找不到 CLLocationManagerDelegate
的协议声明
我尝试添加 -framework CoreLocation
作为编译器选项,但仍然没有找到。
如何为依赖于 CoreLocation
的框架创建 cinterop?
我注意到头文件有
@class CLLocationManager;
@class CLLocation;
@class CLheading;
但是没有 CLLocationManagerDelegate 的前言声明,但我对 Swift 和 Objective-C 的了解不够,无法判断这是否是一个损坏的头文件。
我还从头文件中删除了对 CoreLocation 的所有引用,它进入了另一个部分,它依赖于另一个框架中的类。该代码是必需的,无法删除。
头文件包含了这个框架和 CoreLocation 的导入,但它仍然找不到符号。导入没有错误。
尝试添加 -framework 选项作为编译器选项,但仍然找不到符号。框架搜索路径有 -F 选项。
val architecturePath = when(targetName) {
"iosX64" -> "ios-x86_64-simulator"
"iosArm64" -> "ios-arm64"
else -> throw IllegalStateException("UnkNown architecture,$targetName")
}
val mapboxcoreMaps = File(projectDir,"libs/MapboxcoreMaps.xcframework/$architecturePath").absolutePath
val mapBoxMaps = File(projectDir,"libs/MapBoxMaps.xcframework/$architecturePath").absolutePath
compilations {
@Suppress("UNUSED_VARIABLE")
val main by getting {
cinterops {
val mapBox by creating {
defFile = File("$projectDir/libs/mapBox.def")
packageName("com.mapBox")
compilerOpts("-F$mapboxcoreMaps","-F$mapBoxMaps","-framework","MapboxcoreMaps")
}
}
}
}
MapBox.def
language = Objective-C
modules = MapBoxMaps
linkerOpts = -framework MapboxcoreMaps -framework MapBoxMaps
解决方法
我认为您需要将depends 部分添加到.def 文件中。例如,查看它是如何完成的at the Kotlin/Native repository,其中 CoreData 框架被定义为平台库。我会说它应该看起来像
depends =CoreLocation
language = Objective-C
modules = MapboxMaps
compilerOpts = -framework MapboxCoreMaps -framework MapboxMaps
linkerOpts = -framework MapboxCoreMaps -framework MapboxMaps