1

我正在尝试制作一个在 Kotlin-Native 中读取和执行 C 代码的军国主义示例。我在这里关注这篇文章。但是,我在最后一步收到“未解决的参考”错误。这是我正在使用的所有文件/命令。我的操作系统是Windows。

测试库

#ifndef MY_TEST_LIB
#define MY_TEST_LIB

int getRandomNumber();

#endif

测试库

#include "testlib.h"

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

int getRandomNumber() {
    return rand();
}

我已经将这些文件编译成一个名为libtestlib.lib. 我的目标是getRandomNumber从 Kotlin Native 内部调用。


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

测试库.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())


有人能指出我哪里出错了吗?

4

3 回答 3

2

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

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

gcc -c testlib.c -o testlib.o && ar rc testlib.a testlib.o
于 2018-08-28T11:08:54.930 回答
1

headerFilter你的值testlib.def不正确。您可以尝试将其删除。

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

于 2018-08-29T14:43:00.957 回答
1

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

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

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

问题已解决,kotlin 文件符合/运行没有问题!

于 2018-08-29T20:17:50.913 回答