Kotlin/Native OpenGL 互操作
Kotlin/Native OpenGL interop
我正在尝试设置 kotlin/native 使用 OpenGL C 库的项目。
OS:ArchLabs,linux 5.1.15(与 arch 共享存储库)
已安装的软件包:glu、glew、freeglut、glfw
在我的 main() 中只有一个函数被调用(它是从 samples 复制的):
glutInit(argc.ptr, null)
我的项目中没有开箱即用的 OpenGL 支持,所以我决定 opengl.def:
package = platform.OpenGL
headers = GL/glut.h
compilerOpts = -I/usr/include
$ ls /usr/include/GL
freeglut_ext.h glcorearb.h gl.h glu_mangle.h glxext.h glx_mangle.h glxtokens.h wglew.h
freeglut.h glew.h gl_mangle.h glut.h glx.h glxmd.h internal
freeglut_std.h glext.h glu.h glxew.h glxint.h glxproto.h osmesa.h
这是我的 gradle.build.kts
:
plugins {
id("org.jetbrains.kotlin.multiplatform") version "1.3.41"
}
repositories {
mavenCentral()
}
kotlin {
linuxX64("opengl") {
val main by compilations.getting
val opengl by main.cinterops.creating
binaries {
executable {
entryPoint = "opengl.main"
}
}
}
}
生成了一个 .kt 文件:build/classes/.../OpenGL/OpenGL.kt
,其中包含 glutInit
函数的定义(好吧,我想更多的是参考)
这是 runReleaseExecutableOpengl
的输出
> Configure project :
Kotlin Multiplatform Projects are an experimental feature.
> Task :cinteropOpenglOpengl
> Task :linkReleaseExecutableOpengl
/home/Opengl/.konan/dependencies/clang-llvm-6.0.1-linux-x86-64/bin/ld.lld: error: undefined symbol: glutInit
>>> referenced by ld-temp.o
>>> /tmp/konan_temp5065866915785286367/combined.o:(platform_OpenGL_kniBridge520)
e: /home/Opengl/.konan/dependencies/clang-llvm-6.0.1-linux-x86-64/bin/ld.lld invocation reported errors
> Task :linkReleaseExecutableOpengl FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':linkReleaseExecutableOpengl'.
> Process 'command '/usr/lib/jvm/java-11-openjdk/bin/java'' finished with non-zero exit value 1
有办法解决吗?我最好的猜测是我必须安装 mingw-w64-*
个软件包,例如 mingw-w64-freeglut
。是这样吗?也可能是我指向了错误的头文件(我还不是很喜欢 C,而且我已经有很长时间没有使用 C++了)并且它找不到这些头文件的实现。
提前致谢!
您需要在 def 文件中 linkerOpts = -L/usr/lib -lglut
,以动态 link 对抗 freeglut。
我正在尝试设置 kotlin/native 使用 OpenGL C 库的项目。
OS:ArchLabs,linux 5.1.15(与 arch 共享存储库)
已安装的软件包:glu、glew、freeglut、glfw
在我的 main() 中只有一个函数被调用(它是从 samples 复制的):
glutInit(argc.ptr, null)
我的项目中没有开箱即用的 OpenGL 支持,所以我决定 opengl.def:
package = platform.OpenGL
headers = GL/glut.h
compilerOpts = -I/usr/include
$ ls /usr/include/GL
freeglut_ext.h glcorearb.h gl.h glu_mangle.h glxext.h glx_mangle.h glxtokens.h wglew.h
freeglut.h glew.h gl_mangle.h glut.h glx.h glxmd.h internal
freeglut_std.h glext.h glu.h glxew.h glxint.h glxproto.h osmesa.h
这是我的 gradle.build.kts
:
plugins {
id("org.jetbrains.kotlin.multiplatform") version "1.3.41"
}
repositories {
mavenCentral()
}
kotlin {
linuxX64("opengl") {
val main by compilations.getting
val opengl by main.cinterops.creating
binaries {
executable {
entryPoint = "opengl.main"
}
}
}
}
生成了一个 .kt 文件:build/classes/.../OpenGL/OpenGL.kt
,其中包含 glutInit
函数的定义(好吧,我想更多的是参考)
这是 runReleaseExecutableOpengl
> Configure project :
Kotlin Multiplatform Projects are an experimental feature.
> Task :cinteropOpenglOpengl
> Task :linkReleaseExecutableOpengl
/home/Opengl/.konan/dependencies/clang-llvm-6.0.1-linux-x86-64/bin/ld.lld: error: undefined symbol: glutInit
>>> referenced by ld-temp.o
>>> /tmp/konan_temp5065866915785286367/combined.o:(platform_OpenGL_kniBridge520)
e: /home/Opengl/.konan/dependencies/clang-llvm-6.0.1-linux-x86-64/bin/ld.lld invocation reported errors
> Task :linkReleaseExecutableOpengl FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':linkReleaseExecutableOpengl'.
> Process 'command '/usr/lib/jvm/java-11-openjdk/bin/java'' finished with non-zero exit value 1
有办法解决吗?我最好的猜测是我必须安装 mingw-w64-*
个软件包,例如 mingw-w64-freeglut
。是这样吗?也可能是我指向了错误的头文件(我还不是很喜欢 C,而且我已经有很长时间没有使用 C++了)并且它找不到这些头文件的实现。
提前致谢!
您需要在 def 文件中 linkerOpts = -L/usr/lib -lglut
,以动态 link 对抗 freeglut。