Kotlin/native gradle 的 cinterop 构建问题
Kotlin/native cinterop build problem with gradle
我正在尝试使用 Kotlin native 和 iOS。我尝试使用 raywenderlich 中的示例作为起点。这个例子有点旧,所以我更新了代码以适应 Kotlin 多平台 1.3.61。我正在使用 AppCode 构建代码。
我正在努力处理 Kotlin DSL gradle 文件 (build.gradle.kts),示例使用 build.gradle :
plugins {
id "org.jetbrains.kotlin.platform.native" version "1.3.0"
}
components.main {
def productsDir = new File("").absolutePath
targets = ['ios_arm64', 'ios_x64']
outputKinds = [EXECUTABLE]
allTargets {
linkerOpts '-rpath', '@executable_path/Frameworks'
linkerOpts "-F${productsDir}"
}
dependencies {
cinterop('AFNetworking'){
packageName 'com.afnetworking'
compilerOpts "-F${productsDir}"
linkerOpts "-F${productsDir}"
includeDirs{
allHeaders "${productsDir}/AFNetworking.framework/Headers"
}
}
}
}
task copyExecutable() {
doLast {
def srcFile = tasks['compileDebugIos_x64KotlinNative'].outputFile
def targetDir = getProperty("konan.configuration.build.dir")
copy {
from srcFile.parent
into targetDir
}
}
}
我试图将其翻译成我自己的 build.gradle.kts 文件:
plugins {
kotlin("multiplatform") version "1.3.61"
kotlin("xcode-compat") version "0.2.5"
}
repositories {
mavenCentral()
}
kotlin {
val productsDir = "/Users/trond/Desktop/native_meteor/native_meteor/"
iosX64("ios")
{
compilations.getByName("main")
{
val myInterop by cinterops.creating {
defFile(project.file("src/nativeInterop/cinterop/afnetworking.def"))
packageName ("com.afnetworking")
compilerOpts ("-F${productsDir}")
// linkerOpts ("-F${productsDir}")
// 3
includeDirs{
allHeaders ("${productsDir}/AFNetworking.framework/Headers")
}
}
}
}
xcode {
setupApplication("native_meteor")
}
}
据我所知,cinterops 工具正在执行它的工作,正在创建一个 klib 文件和一个 afnetworing.kt ( build/classes/kotlin/ios/main/..... )
但是我无法使用库 AFNetworking!我尝试在 ViewController.kt 文件中添加导入指令:
import com.afnetworking.*
但是这个不被识别。这导致项目未构建:
> Task :native_meteor:compileKotlinNative_meteor FAILED
e: /Users/trond/Desktop/native_meteor/native_meteor/src/native_meteorMain/kotlin/ViewController.kt: (15, 8): Unresolved reference: com
e: /Users/trond/Desktop/native_meteor/native_meteor/src/native_meteorMain/kotlin/ViewController.kt: (37, 23): Unresolved reference: AFHTTPSessionManager
e: /Users/trond/Desktop/native_meteor/native_meteor/src/native_meteorMain/kotlin/ViewController.kt: (40, 38): Unresolved reference: AFJSONResponseSerializer
任何人都可以对此有所了解吗?
也许检查结果 .klib 的内容以确保使用正确的包名称是有意义的。可以使用 ~/.konan/kotlin-native-macos-1.3.61/bin/klib
CLI 工具来完成。
此外,我建议您查看 Kotlin/Native Github 中的 this 示例,它还利用 AFNetworking 并使用最新的编译器版本。
感谢您为我指明方向。我调查了 .klib 文件,发现它包含我预期的包。然后,我查看了 Appcode 中 Gradle 窗格中的 Gradle 源集。在这里我发现 .klib 库是在 "iosMain" 而不是 "native_metorMain" 下定义的。然后我发现 iosX64("ios") 行应该是 iosX64("meteor_main")。
之后,当我尝试在 XCode 中编译时出现错误:"ld: framework not found AFNetworking"。然后,我在 afnetworking.def 文件中为 linkerOpts 添加了 -F{full path to framework} ( linkerOpts= -F{full path to framwork} -framework AFNetworking )。
现在项目构建成功。
我正在尝试使用 Kotlin native 和 iOS。我尝试使用 raywenderlich 中的示例作为起点。这个例子有点旧,所以我更新了代码以适应 Kotlin 多平台 1.3.61。我正在使用 AppCode 构建代码。
我正在努力处理 Kotlin DSL gradle 文件 (build.gradle.kts),示例使用 build.gradle :
plugins {
id "org.jetbrains.kotlin.platform.native" version "1.3.0"
}
components.main {
def productsDir = new File("").absolutePath
targets = ['ios_arm64', 'ios_x64']
outputKinds = [EXECUTABLE]
allTargets {
linkerOpts '-rpath', '@executable_path/Frameworks'
linkerOpts "-F${productsDir}"
}
dependencies {
cinterop('AFNetworking'){
packageName 'com.afnetworking'
compilerOpts "-F${productsDir}"
linkerOpts "-F${productsDir}"
includeDirs{
allHeaders "${productsDir}/AFNetworking.framework/Headers"
}
}
}
}
task copyExecutable() {
doLast {
def srcFile = tasks['compileDebugIos_x64KotlinNative'].outputFile
def targetDir = getProperty("konan.configuration.build.dir")
copy {
from srcFile.parent
into targetDir
}
}
}
我试图将其翻译成我自己的 build.gradle.kts 文件:
plugins {
kotlin("multiplatform") version "1.3.61"
kotlin("xcode-compat") version "0.2.5"
}
repositories {
mavenCentral()
}
kotlin {
val productsDir = "/Users/trond/Desktop/native_meteor/native_meteor/"
iosX64("ios")
{
compilations.getByName("main")
{
val myInterop by cinterops.creating {
defFile(project.file("src/nativeInterop/cinterop/afnetworking.def"))
packageName ("com.afnetworking")
compilerOpts ("-F${productsDir}")
// linkerOpts ("-F${productsDir}")
// 3
includeDirs{
allHeaders ("${productsDir}/AFNetworking.framework/Headers")
}
}
}
}
xcode {
setupApplication("native_meteor")
}
}
据我所知,cinterops 工具正在执行它的工作,正在创建一个 klib 文件和一个 afnetworing.kt ( build/classes/kotlin/ios/main/..... )
但是我无法使用库 AFNetworking!我尝试在 ViewController.kt 文件中添加导入指令:
import com.afnetworking.*
但是这个不被识别。这导致项目未构建:
> Task :native_meteor:compileKotlinNative_meteor FAILED
e: /Users/trond/Desktop/native_meteor/native_meteor/src/native_meteorMain/kotlin/ViewController.kt: (15, 8): Unresolved reference: com
e: /Users/trond/Desktop/native_meteor/native_meteor/src/native_meteorMain/kotlin/ViewController.kt: (37, 23): Unresolved reference: AFHTTPSessionManager
e: /Users/trond/Desktop/native_meteor/native_meteor/src/native_meteorMain/kotlin/ViewController.kt: (40, 38): Unresolved reference: AFJSONResponseSerializer
任何人都可以对此有所了解吗?
也许检查结果 .klib 的内容以确保使用正确的包名称是有意义的。可以使用 ~/.konan/kotlin-native-macos-1.3.61/bin/klib
CLI 工具来完成。
此外,我建议您查看 Kotlin/Native Github 中的 this 示例,它还利用 AFNetworking 并使用最新的编译器版本。
感谢您为我指明方向。我调查了 .klib 文件,发现它包含我预期的包。然后,我查看了 Appcode 中 Gradle 窗格中的 Gradle 源集。在这里我发现 .klib 库是在 "iosMain" 而不是 "native_metorMain" 下定义的。然后我发现 iosX64("ios") 行应该是 iosX64("meteor_main")。
之后,当我尝试在 XCode 中编译时出现错误:"ld: framework not found AFNetworking"。然后,我在 afnetworking.def 文件中为 linkerOpts 添加了 -F{full path to framework} ( linkerOpts= -F{full path to framwork} -framework AFNetworking )。
现在项目构建成功。