Kotlin / Native cinterop: compilerOpts внутри файла .def vs compilerOpts внутри gradle

В документации cinterop для Kotlin/Native вы должны определить .def файл, например:

language = Objective-C
modules = FirebaseCore
compilerOpts = -framework FirebaseCore
linkerOpts = -framework FirebaseCore

Теперь вы также можете указать compilerOpts в блоке cinterop, например:

compilations["main"].cinterops {
    firebasecore {
        packageName 'cocoapods.FirebaseCore'
        defFile = file("$projectDir/src/iosMain/c_interop/FirebaseCore.def")
        includeDirs ("$projectDir/../iosApp/Pods/FirebaseCore/Firebase/Core/Public")
        compilerOpts ("-F$projectDir/src/iosMain/c_interop/modules/FirebaseCore-${versions.firebaseCoreIos}")
    }
}

Я взял здесь только этот пример Кевина Галлигана: KMPFirestore.

Я действительно не понимаю, в чем разница между compilerOpts внутри gradle и compilerOpts внутри .def файла?

У меня нет сильного опыта в C, и я просто пытаюсь изучить Kotlin Multiplatform (а пока просто пытаюсь понять, как взаимодействовать с библиотеками c или objectiveC), но я не могу их правильно настроить.

Я был бы очень признателен за помощь, поскольку я даже не совсем понимаю, как работает .def файл.

Любой материал для чтения, связанный с пониманием этих вещей, будет большим подспорьем.


person Archie G. Quiñones    schedule 08.01.2020    source источник


Ответы (1)


AFAIK, два compilerOpts будут объединены при генерации прерываний. К сожалению, linkerOpts не работает. Но для того, чтобы взаимодействие работало правильно и связывалось, мне пришлось также указать абсолютный путь фреймворка для linkerOpts в файле .def.

person Agócs Tamás    schedule 09.01.2020
comment
Под слиянием вы имеете в виду, что когда compilerOpts в gradle определяется как compilerOpts -someOptions, а compilerOpts в .def файле определяется как compilerOpts -anotherOption, результирующий compilerOpts равен -someOption -anotherOption? Есть ли способ проверить, что это работает именно так? (Я совершенно новичок в этом :() Также, если linkerOpts не работает так же, как это работает? - person Archie G. Quiñones; 10.01.2020
comment
Да, именно это я имел в виду. Например, .def имеет compilerOpts = -framework Firebase, а затем я добавляю compilerOpts += "-F$projectDir/cinterop/fws" в свою конфигурацию cinterop gradle, тогда компилятор получит его как -F/User/XYZ/project/cinterop/fws -framework Firebase. Если вы запустите задачу связывания из командной строки с флагом --info, тогда gradle покажет команды, выполняемые задачей cinterop, которые будут содержать compilerOpts. Для части linkerOpts в конфигурации gradle есть переменная, которая работает так же, как compilerOpts, но сборка gradle предупредит вас, что она игнорируется. - person Agócs Tamás; 10.01.2020
comment
Понятно, большое вам спасибо. Есть ли документация о том, какие параметры я мог бы использовать для linkerOpts и compilerOpts? Например, что означает -framework? - person Archie G. Quiñones; 10.01.2020
comment
Все мои знания по теме получены отсюда: kotlinlang.org/docs/reference/native/ c_interop.html и множество поисков по github. Ну и конечно часы проб и неудач ... :( - person Agócs Tamás; 14.01.2020