【发布时间】:2022-11-04 10:20:26
【问题描述】:
我使用 gradle init 创建了一个 Kotlin/Native 项目,并按照此处的说明,成功地构建了项目,并生成了一个 build/bin/native/debugExecutable/executable.kexe 可执行文件。
但是当我尝试运行该项目时,我收到了消息:
/build/bin/native/debugExecutable/executable.kexe: error while loading shared libraries: libone.so: cannot open shared object file: No such file or directory
我正在使用位于目录../libone/libone.so(相对于项目文件夹)中的 C 库。我在我的项目的目录src/nativeInterop/cinterop 上有这个*.dex 文件:
headers = libone.h
package = libone
compilerOpts.linux = -I/.../libone
linkerOpts.linux = -L/.../libone -lone
我尝试将可执行文件 (executable.kexe) 和库 (libone.so) 放在同一目录中,但也不起作用(发生同样的错误)。我在这里缺少什么?
更新我手动将linux环境变量LD_LIBRARY_PATH设置为库目录。我想知道我是否可以在不改变系统的情况下工作。
构建.gradle
plugins {
id 'org.jetbrains.kotlin.multiplatform' version '1.5.31'
}
repositories {
mavenCentral()
}
kotlin {
def hostOs = System.getProperty("os.name")
def isMingwX64 = hostOs.startsWith("Windows")
def nativeTarget
if (hostOs == "Mac OS X") nativeTarget = macosX64('native')
else if (hostOs == "Linux") nativeTarget = linuxX64("native")
else if (isMingwX64) nativeTarget = mingwX64("native")
else throw new FileNotFoundException("Host OS is not supported in Kotlin/Native.")
nativeTarget.with {
compilations.main { // NL
cinterops { // NL
libone // NL
} // NL
} // NL
binaries {
executable {
entryPoint = 'main'
}
}
}
sourceSets {
nativeMain {
}
nativeTest {
}
}
}
libone 的 Makefile
all: libone
libone: libone.o
gcc -shared -o libone.so libone.o -Wl,--out-implib,libone.a
libone.o: libone.c
gcc -fPIC -c libone.c -o libone.o
【问题讨论】:
-
您是否尝试将 .def 文件中的绝对路径设置为链接器选项?我的猜测是相对路径可能是这里的根本原因。
标签: kotlin kotlin-native