go x/mobile:构建不包括libc++_shared.so,无法立即生成.apk并在启动时应用程序立即崩溃,

3qpi33ja  于 3个月前  发布在  Go
关注(0)|答案(9)|浏览(35)

你正在使用的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库。我尝试搜索如何包含这个库或使用其他方法,但都失败了。
有可能添加/链接这个库吗,还是我做错了什么,罪魁祸首可能在别处?谢谢。

envsm3lx

envsm3lx1#

/cc @hyangah@eliasnaur

eqzww0vc

eqzww0vc2#

这可能是gomobile的一个bug,但最好还是与inkyblackness/imgui-go开发者讨论一下是否支持Android,如果支持的话,是如何支持的。

o0lyfsai

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,并提供了触摸屏上感觉良好的示例。到目前为止,看起来很有前途,可能对我需要的东西很好。

9bfwbjaz

9bfwbjaz4#

在使用gomobile-build构建C++文件时,我遇到了相同的问题。修改gradle文件可能会解决这个问题(https://stackoverflow.com/questions/39620739/android-studio-cmake-shared-library-missing-libc-shared-so-can-cmake-bundle),但到目前为止,在gomobile中这是不可能的。

5f0d552i

5f0d552i5#

-static-libstdc++ 添加到 LDFLAGS 可能可以抑制异常。

7dl7o3gd

7dl7o3gd6#

-static-libstdc++ 添加到 LDFLAGS 可能可以抑制异常。
在哪里和如何?gomobile build -ldflags="-static-libstdc++" 不起作用:

gomobile: go build -ldflags -static-libstdc++ -buildmode=c-shared -o C:\Users\Username\AppData\Local\Temp\gomobile-work-425738395\lib\armeabi-v7a\libmobile_app_good.so mobile_app_good failed: exit status 2
# github.com/inkyblackness/imgui-go/v4
warning: unknown warning option '-Wno-subobject-linkage' [-Wunknown-warning-option]
# mobile_app_good
flag provided but not defined: -static-libstdc++
usage: link [options] main.o
  -B note
        add an ELF NT_GNU_BUILD_ID note when using ELF
....
hl0ma9xz

hl0ma9xz7#

我在一个Go文件中添加了它,如下所示:

// #cgo LDFLAGS: -static-libstdc++
import "C"
2j4z5cfb

2j4z5cfb8#

我在一个Go文件中添加了它,如下所示:

// #cgo LDFLAGS: -static-libstdc++
import "C"


编译后不再崩溃。谢谢。
现在只需要编写平台和后端层来与ImGui集成。希望不会遇到无法解决的问题。
plicqrtu

plicqrtu9#

不知道为什么gomobile build -ldflags="-static-libstdc++"不起作用。
我在Go文件中添加了它,如下所示:

// #cgo LDFLAGS: -static-libstdc++
import "C"

这对我有效。谢谢!

相关问题