首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Kotlin /本机:如何将整个GTK4库和头导入到Kotlin本地C互操作?

Kotlin /本机:如何将整个GTK4库和头导入到Kotlin本地C互操作?
EN

Stack Overflow用户
提问于 2022-11-13 17:33:24
回答 1查看 42关注 0票数 1

我正在学习与Kotlin原住民的C互操作。我成功地使用.Def文件导入了我的示例C程序,并在kotlin中执行了代码

因此,我正在考虑将C中的GTK4库导入到Kotlin/Native中,并在那里尝试一个GTK应用程序

但是由于GTK4有大量的头文件和链接库,所以我不知道如何导入它们

我在GTK4 C++项目中成功地执行了CLion示例程序。

但是需要知道如何将GTK4库和头导入到Kotlin/本地项目

我的Cmake in Clion项目

代码语言:javascript
复制
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文件中?

EN

回答 1

Stack Overflow用户

发布于 2022-11-14 02:51:14

我认为使用pkg-config很好,但这可能需要一些解决办法,.def文件不支持执行pkg-config,这是一个可执行的程序,因此您应该更动态地生成def文件。

generate_def.sh

代码语言:javascript
复制
#!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

代码语言:javascript
复制
// ……
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会帮助您的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74423238

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档