«Неразрешенная ссылка» при взаимодействии с библиотекой C - PullRequest
0 голосов
/ 28 августа 2018

Я пытаюсь сделать милитаристский пример чтения и выполнения C-кода в Kotlin-Native. Я следую за этой статьей здесь . Однако на последнем этапе я получаю сообщение об ошибке «Неразрешенная ссылка». Вот все файлы / команды, которые я использую. Моя операционная система 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. Моя цель - позвонить 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 голосов
/ 29 августа 2018
Значение

headerFilter в вашем testlib.def неверно. Вы можете попытаться удалить его.

Фильтр применяется к значению, записанному в директиве #include из заголовков и headers элементам значения из файла .def. Ни одна из этих строк не имеет префикса ./.

0 голосов
/ 29 августа 2018

Ответ - сочетание предложений Святослава Щербина и Майка Синковского.

«headerFilter» был неправильным и его нужно было удалить, а статическую библиотеку нужно было встроить в .klib. Установив testlib.def равным:

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

Проблема решена, и файл kotlin соответствует / работает без проблем!

0 голосов
/ 28 августа 2018

Библиотеки Windows должны создаваться msys2-mingw, а не msvc.

Примерно так (в оболочке mingw64):

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