我正在尝试为框架添加一个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
我认为您需要将dependents部分添加到.def文件中。例如,请参阅如何在Kotlin/Native存储库中完成,在该存储库中,CoreData框架被定义为平台库。我想说它应该看起来像
depends =CoreLocation
language = Objective-C
modules = MapboxMaps
compilerOpts = -framework MapboxCoreMaps -framework MapboxMaps
linkerOpts = -framework MapboxCoreMaps -framework MapboxMaps