Kotlin语/母语:如何将整个GTK 4库和头文件导入到KotlinNative C Interop?

dz6r00yl  于 2022-11-16  发布在  Kotlin
关注(0)|答案(1)|浏览(140)

我正在学习使用KotlinNative的C互操作。我成功地使用.Def文件导入了我的示例C程序,并在Kotlin中执行了代码
因此,我正在考虑将GTK 4库(C语言)导入Kotlin/Native项目,并在那里尝试GTK应用程序
但由于GTK 4有很多头文件和链接库,我不知道如何导入它们
我在CLion C++项目中成功地执行了GTK 4示例程序。
但是需要知道如何将GTK 4库和头文件导入Kotlin/Native项目
我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})

如何将它们Map到Kotlin/Native的.def文件中?

pcww981p

pcww981p1#

我认为使用pkg-config很好,但这可能需要一些变通办法,.def文件不支持pkg-config的执行,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任务中,可以使用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会帮助你

相关问题