我正在学习与Kotlin原住民的C互操作。我成功地使用.Def文件导入了我的示例C程序,并在kotlin中执行了代码
因此,我正在考虑将C中的GTK4库导入到Kotlin/Native中,并在那里尝试一个GTK应用程序
但是由于GTK4有大量的头文件和链接库,所以我不知道如何导入它们
我在GTK4 C++项目中成功地执行了CLion示例程序。
但是需要知道如何将GTK4库和头导入到Kotlin/本地项目
我的Cmake in Clion项目
cmake_minimum_required(VERSION 3.24)
project(HexEditor)
set(CMAKE_CXX_STANDARD 20)
find_package(PkgConfig REQUIRED)
pkg_check_modules(GTK4 REQUIRED gtk4)
include_directories(${GTK4_INCLUDE_DIRS})
link_directories(${GTK4_LIBRARY_DIRS})
add_definitions(${GTK4_CFLAGS_OTHER})
add_executable(HexEditor main.cpp)
target_link_libraries(HexEditor ${GTK4_LIBRARIES})如何将它们映射到Kotlin/原住民的.def文件中?
发布于 2022-11-14 02:51:14
我认为使用pkg-config很好,但这可能需要一些解决办法,.def文件不支持执行pkg-config,这是一个可执行的程序,因此您应该更动态地生成def文件。
generate_def.sh
#!env sh
cflags=$(pkg-config --cflags gtk4)
ldflags=$(pkg-config --libs gtk4)
echo headers = gtk/gtk4.h"\n" > libgtk4.def
echo compilerOpts = ${cflags}"\n" >> libgtk4.def
echo linkerOpts = ${ldflags}"\n" >> libgtk4.def这样的剧本基本上可以满足大多数的需要,但我不满意。我希望这可以集成到分级任务中,并且可以使用gradle任务缓存来提高效率,并且它将对ci/cd更加友好。
build.gradle.kts
// ……
kotlin {
// Here only use arbitrary target as an example, but you should use intellij idea to create the project automatically
val nativeTarget = macosArm64()
nativeTarget.apply {
compilations {
val main by getting {
cinterop {
val libgtk4 by creating {
// Here you can use a more flexible location based on projectDir or project.file instead of an absolute path
deffile("/path/to/your/deffile")
}
}
}
}
}
}
tasks {
val generateDef by registering {
// make def fiel cache able
outputs.cacheIf { true }
outputs.file("/path/to/your/deffile")
doLast {
ProcessBuilder("sh", "-c", "path/to/generate_def.sh", "path/to/your/deffile")
.start()
.wairFor()
}
}
// this val name is like cinterop${nativeTarget.compilations.main.cinterop.libgtk4}Native
val cinteropLibgtk4Native by getting {
dependsOn(generateDef)
}
}
// ……上面写的答案没有ide提示,所以您需要格外小心,我可能会带来一些拼写错误,ide会帮助您的。
https://stackoverflow.com/questions/74423238
复制相似问题