Я закончил с этим cinterops
разделом в build.gradle
fromPreset(presets.iosX64, 'ios') {
// This preset is for iPhone emulator
// Switch here to presets.iosArm64 (or iosArm32) to build library for iPhone device
compilations.main {
outputKinds('FRAMEWORK')
cinterops {
firebase {
defFile "$projectDir/src/iosMain/cinterop/firebase.def"
includeDirs {
allHeaders "$projectDir/../iosApp/Pods/FirebaseCore/Firebase/Core/Public",
"$projectDir/../iosApp/Pods/FirebaseDatabase/Firebase/Database/Public"
}
compilerOpts "-F$projectDir/../iosApp/Pods/Firebase -F$projectDir/../iosApp/Pods/FirebaseCore -F$projectDir/../iosApp/Pods/FirebaseDatabase"
linkerOpts "-F$projectDir/../iosApp/Pods/Firebase -F$projectDir/../iosApp/Pods/FirebaseCore -F$projectDir/../iosApp/Pods/FirebaseDatabase"
}
}
}
}
конец этого .def
файла:
language = Objective-C
headers = FirebaseCore.h FirebaseDatabase.h
Что здесь происходит? Платформы Cocopods находятся в каталоге Pods
вашего проекта xcode. Немного пройдясь по этой папке, вы найдете то, что вам нужно. Я не уверен, что есть какой-то стандарт, но Firebase поместит основной заголовочный файл в папку Public
. и он содержит ссылки на другие заголовочные файлы, которые ему нужны ... Таким образом, вы указываете имена этих файлов в файле .def
в разделе заголовков.
Далее необходимо указать, где искать эти файлы и другие ссылки, на которые они ссылаются. Вы можете сделать это в файле .def
в файле includeDirs
или в файле build.gradle
. Я предпочитаю файл build.gradle, так как он может использовать переменные. Таким образом, вы указываете путь к этим Public
папкам. (Этого достаточно для того, чтобы kotlin мог видеть API библиотеки, но для того, чтобы запустить приложение, вам нужно скомпилировать и связать эту библиотеку ...)
Чем компилятору и компоновщику нужно знать, где находится библиотека / фреймворк. Таким образом, вы указываете путь к корневой папке фреймворка в compilerOpts
и linkerOpts
с префиксом -F
, если это фреймворк, или -L
, если это библиотека.