你正在使用的Go版本是(go version
)?
$ go version
go version go1.16 windows/amd64
这个问题在最新版本的发布中是否会重现?
是的
你正在使用什么操作系统和处理器架构(go env
)?go env
输出
$ go env
set GO111MODULE=
set GOARCH=amd64
set GOBIN=
set GOCACHE=C:\Users\Gedis\AppData\Local\go-build
set GOENV=C:\Users\Gedis\AppData\Roaming\go\env
set GOEXE=.exe
set GOFLAGS=
set GOHOSTARCH=amd64
set GOHOSTOS=windows
set GOINSECURE=
set GOMODCACHE=C:\Users\Gedis\go\pkg\mod
set GONOPROXY=
set GONOSUMDB=
set GOOS=windows
set GOPATH=C:\Users\Gedis\go
set GOPRIVATE=
set GOPROXY=https://proxy.golang.org,direct
set GOROOT=C:\Program Files\Go
set GOSUMDB=sum.golang.org
set GOTMPDIR=
set GOTOOLDIR=C:\Program Files\Go\pkg\tool\windows_amd64
set GOVCS=
set GOVERSION=go1.16
set GCCGO=gccgo
set AR=ar
set CC=gcc
set CXX=g++
set CGO_ENABLED=1
set GOMOD=C:\Users\Gedis\workspace\gomobile\go.mod
set CGO_CFLAGS=-g -O2
set CGO_CPPFLAGS=
set CGO_CXXFLAGS=-g -O2
set CGO_FFLAGS=-g -O2
set CGO_LDFLAGS=-g -O2
set PKG_CONFIG=pkg-config
set GOGCCFLAGS=-m64 -mthreads -fmessage-length=0 -fdebug-prefix-map=C:\Users\Gedis\AppData\Local\Temp\go-build3903890372=/tmp/go-build -gno-record-gcc-switches
你做了什么?
我尝试运行基本的gomobile示例(将golang.org/x/mobile/example/basic复制到我自己的模块),通过运行:"gomobile install basic",它产生了basic.apk,并在真实设备上运行良好。
然后,对于同一个基本示例main.go文件,我只添加了一个CGO库导入:_ "github.com/inkyblackness/imgui-go/v4",以查看它是否可以编译并正常工作。它编译时没有出现任何错误,应用程序安装到了真实设备上,但是当运行它时,它立即崩溃了。
为了查看这个崩溃产生了什么错误,我运行了adb logcat --buffer=crash
,这里是输出:
03-09 23:58:36.606 16313 16313 E AndroidRuntime: FATAL EXCEPTION: main
03-09 23:58:36.606 16313 16313 E AndroidRuntime: Process: org.golang.todo.network, PID: 16313
03-09 23:58:36.606 16313 16313 E AndroidRuntime: java.lang.UnsatisfiedLinkError: dlopen failed: library "libc++_shared.so" not found
03-09 23:58:36.606 16313 16313 E AndroidRuntime: at java.lang.Runtime.loadLibrary0(Runtime.java:1016)
03-09 23:58:36.606 16313 16313 E AndroidRuntime: at java.lang.System.loadLibrary(System.java:1669)
03-09 23:58:36.606 16313 16313 E AndroidRuntime: at org.golang.app.GoNativeActivity.load(GoNativeActivity.java:56)
03-09 23:58:36.606 16313 16313 E AndroidRuntime: at org.golang.app.GoNativeActivity.onCreate(GoNativeActivity.java:64)
03-09 23:58:36.606 16313 16313 E AndroidRuntime: at android.app.Activity.performCreate(Activity.java:7327)
03-09 23:58:36.606 16313 16313 E AndroidRuntime: at android.app.Activity.performCreate(Activity.java:7318)
03-09 23:58:36.606 16313 16313 E AndroidRuntime: at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
03-09 23:58:36.606 16313 16313 E AndroidRuntime: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3094)
03-09 23:58:36.606 16313 16313 E AndroidRuntime: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3257)
03-09 23:58:36.606 16313 16313 E AndroidRuntime: at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
03-09 23:58:36.606 16313 16313 E AndroidRuntime: at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
03-09 23:58:36.606 16313 16313 E AndroidRuntime: at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
03-09 23:58:36.606 16313 16313 E AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1948)
03-09 23:58:36.606 16313 16313 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:106)
03-09 23:58:36.606 16313 16313 E AndroidRuntime: at android.os.Looper.loop(Looper.java:214)
03-09 23:58:36.606 16313 16313 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:7050)
03-09 23:58:36.606 16313 16313 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
03-09 23:58:36.606 16313 16313 E AndroidRuntime: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)
03-09 23:58:36.606 16313 16313 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:965)
似乎缺少libc++_shared.so库。我尝试搜索如何包含这个库或使用其他方法,但都失败了。
有可能添加/链接这个库吗,还是我做错了什么,罪魁祸首可能在别处?谢谢。
9条答案
按热度按时间envsm3lx1#
/cc @hyangah@eliasnaur
eqzww0vc2#
这可能是gomobile的一个bug,但最好还是与inkyblackness/imgui-go开发者讨论一下是否支持Android,如果支持的话,是如何支持的。
o0lyfsai3#
inkyblackness/imgui-go 不支持 Android。它是一个纯粹的 Dear ImGui 绑定库,没有平台或后端层(有一个单独的仓库包含 glfw/sdl 和 opengl2/3 示例:https://github.com/inkyblackness/imgui-go-examples)。
我需要创建一个 Android 应用,最初我尝试了 Flutter,但并不真正喜欢它:Dart 语言,与 imgui 相比,状态管理非常混乱(至少在我看来,它看起来过于复杂)。
后来我在想,也许我应该只使用 Dear ImGui 与 C++(一周前合并了 Android 后端的 pull request),因为我非常熟悉 imgui-go,并在桌面程序中经常使用它。这似乎是个不错的选择,但它是 C++ 语言,而不是 Go,所以我犹豫不决(可能会选择这个选项)。
然后我们遇到了一个当前的问题,我尝试使用 gomobile 与 imgui-go(之前我甚至不知道 gomobile 的存在),当时我对此抱有希望,因为这样我就可以同时使用 Go 和 ImGui,但它崩溃了。我尝试了各种方法来包含 libc++_shared.so,但都没有成功。
无论如何,由于这个问题可能无法很快解决(至少不会解决得足够快),我还是认为使用 Go 是很好的选择,所以接下来我会尝试使用你们的 Gio 库。它的方法也是 imgui,并提供了触摸屏上感觉良好的示例。到目前为止,看起来很有前途,可能对我需要的东西很好。
9bfwbjaz4#
在使用gomobile-build构建C++文件时,我遇到了相同的问题。修改gradle文件可能会解决这个问题(https://stackoverflow.com/questions/39620739/android-studio-cmake-shared-library-missing-libc-shared-so-can-cmake-bundle),但到目前为止,在gomobile中这是不可能的。
5f0d552i5#
将
-static-libstdc++
添加到LDFLAGS
可能可以抑制异常。7dl7o3gd6#
将
-static-libstdc++
添加到LDFLAGS
可能可以抑制异常。在哪里和如何?
gomobile build -ldflags="-static-libstdc++"
不起作用:hl0ma9xz7#
我在一个Go文件中添加了它,如下所示:
2j4z5cfb8#
我在一个Go文件中添加了它,如下所示:
// #cgo LDFLAGS: -static-libstdc++
import "C"
plicqrtu9#
不知道为什么
gomobile build -ldflags="-static-libstdc++"
不起作用。我在Go文件中添加了它,如下所示:
这对我有效。谢谢!