如何在 non-local 包错误中本地导入

How to local import in non-local package error

我正在尝试使用命令 gomobile bind --target=android 在 Windows 7 64 位中生成一个 .aar 文件,它给了我标题错误。我一直在寻找,但找不到答案。我正在尝试使用该程序在 Android Studio 中制作一个应用程序,它的第一部分如下:

package main (I changed it to "random" for the bind command to work - that's the thing to do, right?)

import (
    "github.com/elazarl/goproxy"
    "text/template"
    "net/http"
    "regexp"
    "bytes"
    "log"
    "net"
)

错误如下:

gomobile: go build -buildmode=c-shared -o=C:\Users\[User name]\AppData\Local\Temp\gomobile-work-101707703\android\src\main\jniLibs\armeabi-v7a\libgojni.so gobind failed: exit status 1
..\[User name]\AppData\Local\Temp\gomobile-work-101707703\src\gobind\go_randommain.go:17:2: local import "." in non-local package

我遵循的其中一个指南是 https://dzone.com/articles/gomobile-library-development-for-iosandroid,我做的大部分事情都是从那里开始的。我从来没有听说过这种语言,所以我是初学者(如果这是一个愚蠢的问题,我很抱歉)。

根据我的阅读,这可能是因为程序中有例如“.\greetings”(带有“.\”的东西与相对路径有关),所以我不知道为什么会这样。有人可以帮忙吗?如果我需要提供更多数据,请告诉我,我会提供。

提前致谢!

编辑: 我尝试将 "package random" 更改为 "package thing" 并且错误的最后一部分将 "random" 更改为 "thing":

..\[User name]\AppData\Local\Temp\gomobile-work-101707703\src\gobind\go_thingmain.go:17:2: local import "." in non-local package

难道我不应该尝试转换这个程序,因为它是以无法转换的方式编写的吗?或者别的什么?

如果有任何帮助,我在 Windows 中的用户名有一个 space,但在 CMD 中它显示为未完成的名称,最后是 ~1,所以它没有'至少在命令的 return 处有 space。而且我不明白那些 17:2 东西指向哪里。我知道这是一行和一列,但我不知道去哪里查找错误,因为我什至试图转到生成的文件,但我找不到它。当我复制创建的文件夹时,只有 4 或 5 个文件随附,没有文件夹,所以我看不到该文件中的错误来理解这一点......希望有人知道答案或可能的答案。

编辑 2: 现在我决定尝试删除导入后的所有代码,只在 .go 文件中显示代码中显示的内容,它给出了以下错误:

gomobile: C:\Users\[User name]\go\bin\gobind.exe -lang=go,java -outdir=C:\Users\[User name\AppData\Local\Temp\gomobile-work-847973191 . failed: exit status 1
no exported names in the package "."
no exported names in the package "."
no exported names in the package "."
no exported names in the package "."

而且我没有任何“.”在文件中,所以我可能会想到“。”指的是一些包,但我不知道,因为只有 4 个而不是 7 个是导入的。 刚才我删除了文件中的所有内容,除了第一行 package random 并且它给出了与上面相同的错误。有什么帮助吗? (如果我需要提供更多信息,请告诉我)我不明白是什么原因造成的,因为我在 Internet 上看到的唯一示例与文件中的相对导入有关。我的 GOPATH 错了吗?我把它设为默认值%USERNAME%/go。这是一个可执行文件。我试图通过将包更改为随机来将其转换为库。我不知道它是否与此有关,甚至我是否需要更改其他任何内容才能将其用作库。

编辑 3(太多了,但我会尽力提供尽可能多的信息):

我尝试一段一段地删除代码,直到第一个错误更改为其他错误,程序中唯一剩下的代码是:

package thing

func ExternalIP()

使用这段代码,它仍然给出第一个错误。如果我尝试删除第一行,它会出现期望包的错误。但是,如果我尝试更改该函数的名称,甚至将 E 更改为 e,则会出现第三个错误。我不知道那个函数名有什么特殊的,但是我在我的整个计算机上的任何文件中都找不到 "ExternalIP" 名称,所以我不知道这与 [=70= 有什么关系] 进口或类似的东西。 如果有帮助,我尝试放入 Android Studio 的程序如下:https://github.com/mondul/PS3-Proxy/blob/master/ps3-proxy.go(这不是我的,如果可以的话,我打算向做这件事的人致敬了解如何将其转换为 .aar 文件,然后在 Android Studio 上使用它)。

编辑 4:

我尝试 运行 使用 GOPATH/src/folder 中的文件 ps3-proxy.go(我要转换的文件)执行该命令,但它给出了不同的错误:

gomobile: go build -buildmode=c-shared -o=C:\Users\[User Name]\AppData\Local\Temp\gomobile-work-722000459\android\src\main\jniLibs\armeabi-v7a\libgojni.so gobind failed: exit status 2
# runtime/cgo
clang.exe: error: unknown argument: '-fno-addrsig'

我不知道这是什么意思,因为我什至无法在 Google 上找到关于 clang.exe 这个特定错误的信息,所以我不知道我是否 "solved" 主要问题但又产生了另一个问题,或者如果我不应该把文件放在那里,然后我回到主要问题(即使我做对了,我也有其他问题,但我也找不到...).

编辑 5(很酷,还有 5 个...):

我尝试了另一个代码并在其他测试中做了同样的事情,我得到了与原始程序相同的错误,所以它可能与程序无关......太棒了,现在我完全不知道该怎么做.代码如下,以防万一它可能有用:

package random

import (
    "math/rand"
    "time"
)

func SudoRandomNumer() int {
    return rand.Intn(time.Now().Second())
}

这是一个错误吗?我想我安装了所有应该安装的东西(好吧,或者可能没有,或者这不会发生,也许)。我已经尝试卸载并再次安装大约 3 次。而且它仍然不起作用。我从一个网站上获取的代码,其中包含如何执行我想执行的操作的示例:http://www.codingvelocity.com/2015/08/08/go-bind-intro.html.

所以我终于明白了 EDIT 4 的问题所在(我认为这是正确的做法,至少在我的情况下)...因为它可能与任何程序都无关并且它说关于可能必须做的错误 clang.exe,我去寻找它并发现它在 ndk-bundle 文件夹中。那个文件夹我是从官网下载的,改名后放到我的Android SDK Tools文件夹里用的。我不知道为什么我没有从 Android Studio 下载它,但我没有。因此,在知道文件位于我从外部下载的文件夹中而不是从 Android Studio 内部下载后,我删除了所有内容并重新下载了 NDK Bundle,但这次是从 Android Studio(以防万一可能有用)要知道,我下载了我们点击显示过时包时显示的所有其他内容),它终于成功了!然后为了确定问题是我从 Android Studio 外部下载的,我再次使用了那个下载的版本,它给出了相同的 clang.exe 错误。之后,再次尝试使用从 Android Studio 下载的版本再次运行。所以这可能是一个错误或类似的问题,因为至少对我来说它只适用于 Android Studio NDK Bundle 版本,而不适用于从他们的网站下载的版本。这很奇怪,但至少它终于起作用了。

现在我只是不明白为什么我必须将我要转换的所有文件都放在 GOPATH\src\[文件夹] 中才能工作并且不给我非本地的东西错误(顺便说一句,在我的例子中,我的 GOPATH 是 C:\Users\[User Name]\go,以防万一知道它可能有用)...两个程序(一个来自 GitHub,另一个来自 GitHub带有教程的网站)必须放在要转换的路径中,并且不能在它之外转换。那真是怪了。我不知道它是否应该是那样的,但至少它在工作...... [编辑: 这是因为我没有阅读关于如何执行 go 程序的文档...不再发生,因为现在我正在执行正确的命令。]

希望这对遇到此问题的其他人有所帮助!