互操作C库时出现“未解析的参考”

时间:2018-08-28 08:01:57

标签: c kotlin kotlin-interop kotlin-native

我试图举一个军事例子,说明如何在Kotlin-Native中读取和执行C代码。我正在关注本文here。但是,我在最后一步收到“无法解析的引用”错误。这是我正在使用的所有文件/命令。 我的操作系统是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())


有人可以指出我出了错吗?

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

您的headerFilter中的

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

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

答案 2 :(得分:1)

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

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

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

问题已解决,kotlin文件可以正常运行/运行!