2015-07-10 106 views
1

我在Go中编写了一个非常小的应用程序,并将AWS Linux AMI配置为主机。该应用程序是一个非常简单的Web服务器。我已经按照信函的官方文档中的说明在Linux VM上安装了Go。使用“go run main.go”命令调用时,我的应用程序按预期运行。在Linux中运行Google Go二进制文件的无效参数

但是,当我尝试手动启动由于运行“go install”而生成的二进制文件时,收到“无效参数”错误。相反,如果我运行“go build”(我的理解基本上是相同的,只有一些例外),然后调用生成的二进制文件,应用程序将按预期启动。

我从$GOPATH/bin/文件夹中调用该文件,如下所示:

./myapp 

我还添加$GOPATH/bin$PATH变量。 我也将$GOPATH/bin/中的二进制文件移动到src文件夹,并从那里成功运行。

Linux实例是一个64位实例,并且我已经安装了相应的Go 64位安装。

+1

可能不相关(它必须是一些Go的东西构建错误的可执行文件格式):有相当多的错误来自linux并且很难识别:例如,如果可执行格式是ELF,但它没有指定ld.so(ld-linux.so)入口点正确,错误将是“未找到文件”。无论如何,在你的二进制文件上运行ldd以查看它是否正常。 –

+0

从ldd输出:linux-vdso.so.1 =>(0x00007ffd50dbb000) libpthread.so.0 => /lib64/libpthread.so.0(0x00007f6a5dc87000) libc.so.6 => /lib64/libc.so.6(0x00007f6a5d8c6000) /lib64/ld-linux-x86-64.so.2(0x00007f6a5dea9000) –

+1

尝试在错误的可执行文件上运行strace。它会显示你的程序运行的所有系统调用。所有库将读取并显示在系统调用中。阅读输出以找出失败的原因。 –

回答

1

go build构建一切(即,所有相关的包),然后产生所得到的可执行文件,然后丢弃该中间结果(见this一种替代取;还考虑的go help buildgo help install仔细阅读输出)。

go install反之,如果找到它们,则使用预编译版本的相关软件包;否则它也会构建它们,并在$PATH/pkg下安装。因此,我可能会建议go install看到一些过时的软件包,这些软件包将产生的内部版本拧紧。

考虑在您的$GOPATH/src中运行go install ./...。 或者对于每个相关软件包可能只是选择性的go install uri/of/the/package,然后重试构建可执行文件。

+0

我已应用您概述的步骤,但问题依然存在。奇怪的是,如果我将从“go build”生成的二进制文件复制到$ GOPATH/bin文件夹中,并尝试执行它,我会得到“无效参数”错误。然而,它在构建之后从$ GOPATH/src/myapp文件夹执行时运行没有问题。 –

+1

如果您怀疑它是过时的编译软件包,您可以运行'go install -a'(一次)强制它重建相关的软件包。或者,您可以删除'$ GOPATH/pkg'目录中的所有内容,然后'go install'会在第一次需要时创建每个包的新副本。 –

+1

@PaulMooney,请小心在'strace'下面(从失败的位置开始)呢?或者,在环境中使用'LD_VERBOSE = 1'的时候尝试运行它,以使动态加载程序打印它启动程序的功能(参见'ld.so(8)'手册页)。 – kostix