首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在互操作C库时出现“未解析的引用”

在互操作C库时出现“未解析的引用”
EN

Stack Overflow用户
提问于 2018-08-28 16:01:57
回答 3查看 644关注 0票数 1

我正在尝试创建一个在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())

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-08-30 04:17:51

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

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

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

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

票数 1
EN

Stack Overflow用户

发布于 2018-08-28 19:08:55

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

如下所示(在mingw64 shell中):

gcc -c testlib.c -o testlib.o && ar rc testlib.a testlib.o
票数 2
EN

Stack Overflow用户

发布于 2018-08-29 22:43:01

testlib.def中的headerFilter值不正确。您可以尝试删除它。

筛选器应用于在来自.def文件的headers和headers value元素的#include指令下写入的值。这些字符串都没有./前缀。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52052921

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档