"Unresolved Reference" 互操作 C 库时

"Unresolved Reference" when Interop-ing C Library

我正在尝试制作一个在 Kotlin-Native 中读取和执行 C 代码的军国主义示例。我正在关注这篇文章 here。但是,我在最后一步收到 "Unresolved Reference" 错误。这是我正在使用的所有 files/commands。 我的操作系统是 Windows.

testlib.h

#ifndef MY_TEST_LIB
#define MY_TEST_LIB

int getRandomNumber();

#endif

testlib.c

#include "testlib.h"

#include <stdio.h>
#include <stdlib.h>

int getRandomNumber() {
    return rand();
}

我已将这些文件编译成名为 libtestlib.lib 的静态库。我的目标是从 Kotlin Native 中调用 getRandomNumber


接下来我有这些 kotlin 相关文件:

testlib.def

headers = testlib.h
headerFilter = ./*
compilerOpts = -L. -ltestlib -I.

CLibTest.kt

import testlib.*

fun main(args: Array<String>) {
    println(getRandomNumber())
}

最后,我运行这两个命令。 第一个做出klib:

cinterop -def testlib.def -o testlib


然后是创建可执行文件的最后一个:

konanc CLibTest.kt -library testlib

一切正常,直到最后一个命令出现以下错误:

CLibTest.kt:4:10: error: unresolved reference: getRandomNumber println(getRandomNumber())


谁能指出我哪里出错了?

Windows 库必须由 msys2-mingw 创建,而不是 msvc。

类似这样的东西(在 mingw64 shell 中):

gcc -c testlib.c -o testlib.o && ar rc testlib.a testlib.o

headerFiltertestlib.def 中的值不正确。您可以尝试将其删除。

过滤器应用于 headers 中的 #include 指令下写入的值和 .def 文件中的 headers 值元素。 None 个字符串有 ./ 个前缀。

答案是 Svyatoslav Scherbina 和 Mike Sinkovsky 的建议组合。

"headerFilter"不正确,需要删除,静态库需要嵌入.klib。通过设置 testlib.def 为:

headers = testlib.h
compilerOpts = -I.
staticLibraries = libtestlib.lib
libraryPaths = .

问题已解决,kotlin 文件 complies/runs 没有问题!