go交叉编译
‘壹’ Go语言怎么交叉编译别的机器或系统的可执行文件
windows下面用以下代码,最好放一个bat文件里.[mw_shl_code=applescript,true]set GOROOT=c:\mygoset GOOS=windowsset GOARCH=386set GOPATH=c:\mygopathset PATH=%PATH%;c:\mingw\bin;%GOROOT%\bincd %GOPATH%\src[/mw_shl_code]
‘贰’ 我在进行实习,单位给了一个题目是将goahead移植到一个arm板子里。我在linux下输入make clean 没有错误,
arm-elf-gcc-c: not found
意思是没有找到交叉编译器arm-elf-gcc,你有没有这个交叉编译器呀?
或者你的环境变量没有设置,要在环境变量里面加入你的交叉编译器路径,才能找到。
设置环境变量好像是
1. 查看/etc/profile文件
2. 查看 .bashrc文件。
然后export PATH=你的环境变量:$PATH;
具体修改环境变量的方法你自己可以网络。
仅供参考。。。
!!!!哦,等一下,你这个arm-elf-gcc-c中间为什么没有空格!应该是arm-elf-gcc -c吧。。
‘叁’ Go语言的支持平台
LiteIDE是一款专门为Go语言开发的跨平台轻量级集成开发环境(IDE),由QT编写。
LiteIDE主要特点: 支持主流操作系统
Windows
Linux
MacOS X Go编译环境管理和切换
管理和切换多个Go编译环境
支持Go语言交叉编译 与Go标准一致的项目管理方式
基于GOPATH的包浏览器
基于GOPATH的编译系统
基于GOPATH的Api文档检索 Go语言的编辑支持
类浏览器和大纲显示
Gocode(代码自动完成工具)的完美支持
Go语言文档查看和Api快速检索
代码表达式信息显示F1
源代码定义跳转支持F2
Gdb断点和调试支持
gofmt自动格式化支持 其他特征
支持多国语言界面显示
完全插件体系结构
支持编辑器配色方案
基于Kate的语法显示支持
基于全文的单词自动完成
支持键盘快捷键绑定方案
Markdown文档编辑支持
实时预览和同步显示
自定义CSS显示
可导出HTML和PDF文档
批量转换/合并为HTML/PDF文档 Sublime Text 2(以下简称Sublime)+ GoSublime + gocode + MarGo的组合。
其优点有: 自动化提示代码。 保存的时候自动格式化代码,让您编写的代码更加美观,符合Go的标准。 支持项目管理 支持语法高亮 熟悉Java的读者应该对于idea不陌生,idea是通过一个插件来支持go语言的高亮语法,代码提示和重构实现。
‘肆’ linux下怎么安装Go开发环境
一、Go安装使用
1、下载Go源码包
https://storage.googleapis.com/golang/go1.6.3.linux-amd64.tar.gz
上传到/usr/local/src目录下
2、编译安装Go到/usr/local
tar zxvf go1.6.3.linux-amd64.tar.gz -C /usr/local/
#注:必须使用root账户或者使用sudo来解压缩Go源码包
3、设置PATH环境变量,添加/usr/local/go/bin到环境变量
export PATH=$PATH:/usr/local/go/bin
4、安装到自定义位置
Go二进制文件默认安装到/usr/local/go,但是可以安装Go工具到不同的位置,可以自行定义,只需要设置正确的环境变量。
例如,安装Go到家目录下,必须添加环境变量到$HOME/.profile
export GOROOT=$HOME/go
export PATH=$PATH:$GOROOT/bin
注:安装Go到其他目录时,GOROOT必须设置为环境变量
5、检查是否正确安装程序
通过设置一个工作区和建立一个简单的程序,检查是否正确安装了一个简单的程序。创建一个目录包含您的工作空间,例如/data/work,并设置GOPATH环境变量指向的位置。
export GOPATH=/data/work
#如果不存在/data/work,需要新建
然后,在你的工作内创建src/github.com/user/hello,如果使用github,可以使用自己的用户名代替user,在hello目录下,新建hello.go
# cat hello.go
package main
import "fmt"
func main {
fmt.Printf("hello,world!\n")
}
#使用go编译hello.go
go install github.com/user/hello
#上面的命令讲名叫hello(or hello.exe)的程序放到你的工作区内,执行下面命令,会得到输出结果。
$GOPATH/bin/hello
hello,world!
#当出现hello,world!表明Go已经安装成功可以工作。
二、Go工作区介绍
1、机构组织代码概述
Go语言程序通常将所有的代码保存在一个工作区中。
工作区包含许多版本控制库(由Git管理)。
每个存储库包含一个或多个包。
每个包由一个或多个在一个目录中的源文件组成。
一个包的目录的路径决定其导入路径。
注:同于其他的编程环境中,每一个项目都有一个独立的工作区且工作区是紧密联系在一起的版本控制库。
2、工作区介绍
工作区是一个目录层次结构,它的根目录有三个目录:
src 包含Go源文件
pkg 包含对象和包
bin 包含可执行命令
Go工具创建源码包并安装二进制文件到pkg和bin目录下
src目录通常包含多个版本控制库(如Git或Mercurial),跟踪一个或多个源包的开发。
下面展示一个好的工作区的例子:
bin/
hello # command executable
outyet # command executable
pkg/
linux_amd64/
github.com/golang/example/
stringutil.a # package object
src/
github.com/golang/example/
.git/ # Git repository metadata
hello/
hello.go # command source
outyet/
main.go # command source
main_test.go # test source
stringutil/
reverse.go # package source
reverse_test.go # test source
golang.org/x/image/
.git/ # Git repository metadata
bmp/
reader.go # package source
writer.go # package source
... (many more repositories and packages omitted) ...
上面的属性图展示了一个包含两个存储库(example和image)的工作区,example 存储库包含两个命令(hello,outyet),image库包含bmp包和几个其他的包。
一个典型的工作区包含包含许多软件包和命令的多个源库。大多数程序员将所有的源代码和依赖关系保存在一个工作区中
3、GOPATH环境变量设置
GOPATH环境变量指定工作区的位置。它很可能是唯一的环境变量,代码开发时需要设置。
开始,创建一个工作区目录并设置相应的gopath。您的工作区可以位于任何你喜欢的地方,但我们将在这个文档中使用/data/work。请注意,这不能是您的“Go安装”路径相同。
mkdir -p /data/work
export GOPATH=/data/work
为了方便。添加工作区的bin到PATH中
export PATH=$PATH:$GOPATH/bin
4、导入路径
一个导入路径是唯一标识一个包的字符串。一个包的导入路径对应于它在工作区内或远程存储库中的位置。
从标准库的软件包中给出了短的导入路径等。对于您自己的包,您必须选择不可能和未来添加到标准库或其他外部库的基础路径冲突的路径。
注意,你不需要将你的代码发布到一个远程存储库之前,你可以建立它。这只是一个很好的习惯来组织你的代码,如果你有一天会出版它。在实践中,你可以选择任何任意的路径名称,只要它是唯一的标准库和更大的去生态系统。
我们将使用github.com/user作为我们的基本路径。在您的工作区中创建一个目录,以保持源代码:
mkdir -p $GOPATH/src/github.com/user
5、第一个项目
编译并运行一个简单的程序,首先选择一个包的路径(我们将使用github.com/user/hello)和创建在您的工作区相应的软件包目录:
mkdir $GOPATH/src/github.com/user/hello
创建名叫hello.go的文件,上面创建过,此处略过。
cd $GOPATH/src/github.com/user/hello
go install
$GOPATH/bin/hello
或者:
hello
如果你使用的是一个源代码管理系统,现在是一个很好的时间来初始化一个存储库,添加文件,并提交你的第一次更改。再次,这一步是可选的:您不需要使用源代码管理来写代码。
cd $GOPATH/src/github.com/user/hello
git init
Initialized empty Git repository in /data/work/src/github.com/user/hello/.git/
git add hello.go
git commit -m "first commit"
[master (root-commit) bbfb477] first commit
6、first library
mkdir $GOPATH/src/github.com/user/stringutil
下一步,在目录下创建一个名为reverse.go文件中有下列内容:
// Package stringutil contains utility functions for working with strings.
package stringutil
// Reverse returns its argument string reversed rune-wise left to right.
func Reverse(s string) string {
r := []rune(s)
for i, j := 0, len(r)-1; i < len(r)/2; i, j = i+1, j-1 {
r[i], r[j] = r[j], r[i]
}
return string(r)
}
使用go build测试包的编译
$ go build github.com/user/stringutil
如果当前位置源码包目录,只需要:
go build
上面操作并不会产生一个输出文件,必须使用go install,把包和对象输出到工作去的pkg目录内
确认stringutil包创建完成后,修改原始hello.go,使用stringutil包:
package main
import (
"fmt"
"github.com/user/stringutil"
)
func main() {
fmt.Printf(stringutil.Reverse("\n !oG ,olleH"))
}
无论使用go安装包还是二进制文件,所有相关的依赖都会自动安装。所以当你安装hello程序时:
$ go install github.com/user/hello
对应的stringutil包会自动安装好。
执行新的hello程序,可以看到消息已经被反转
# hello
Hello, Go!
完成上面操作之后,工作区应该为:
├── bin
│ └── hello # command executable
├── pkg
│ └── linux_amd64 # this will reflect your OS and architecture
│ └── github.com
│ └── user
│ └── stringutil.a # package object
└── src
└── github.com
└── user
├── hello
│ └── hello.go # command source
└── stringutil
└── reverse.go # package source
注意:go install会把库文件stringutil.a放到pkg/linux_amd64下边(目录结构跟源代码结构一样)。这样可以go命令可以直接找到对应的包对象,避免不必要的重复编译。linux_amd64是为了根据操作系统和你的系统架构交叉编译。
所有Go可执行程序都通过静态方式链接在一起,所以在运行时是不需要相关的包对象(库)。
7、包命令
所有的Go源代码都以下面的语句开始:
package name
其中name就是包引用默认的名称,一个包中的所有文件必须使用同一个包名,可执行命令必须是main。
一个二进制文件下所有的包名不需要唯一,但是引用路径必须唯一
8、测试
Go自带了一个轻量级的测试框架,由go test和testing包组成。
可以通过新建xx_test.go写一个测试,其中包含若干个TestXXX函数。测试框架会自动执行这些函数;如果函数中包含tError或t.Fail, 对应的测试会被判为失败。
添加一个针对stringutil的测试文件$GOPATH/src/github.com/user/stringutil/reverse_test.go,包含以下内容:
package stringutil
import "testing"
func TestReverse(t *testing.T) {
cases := []struct {
in, want string
}{
{"Hello, world", "dlrow ,olleH"},
{"Hello, 世界", "界世,olleH"},
{"", ""},
}
for _, c := range cases {
got := Reverse(c.in)
if got != c.want {
t.Errorf("Reverse(%q) == %q, want %q", c.in, got, c.want)
}
}
}
#通过go test测试
# go test github.com/user/stringutil
ok github.com/user/stringutil 0.002s
#同样的,在包文件夹下可以忽略路径而直接执行go test
[root@zabbix stringutil]# go test
PASS
ok github.com/user/stringutil 0.002s
9、远程包
包的引用路径用来描述如何通过版本控制系统获取包的源代码。go工具通过引用路径自动从远程代码仓库获取包文件。比如本文中用的例子也对应的保存在github.com/golang/example下。go可以通过包的代码仓库的url直接获取、生成、安装对应的包。
[root@zabbix ~]# go get github.com/golang/example/hello
[root@zabbix ~]# $GOPATH/bin/hello
Hello, Go examples!
如果工作区中不存在对应的包,go会将对应的包放到GOPATH环境变量指明的工作区下。(如果包已经存在,go跳过代码拉去而直接执行go install)
建议详细看一下http://www.linuxprobe.com/set-go-env.html这个,有图文
‘伍’ 编译好的golang 服务器 需要 安装 go 吗
不用,但是编译的系统环境,要和运行的系统环境一样(比如都是Linux64位的),当然也可以交叉编译(在Windows上就可以编译出Linux能用的可执行文件)
‘陆’ go语言哪个包简单一点,可以看源码
LiteIDE是一款专门为Go语言开发的跨平台轻量级集成开发环境(IDE),由QT编写。LiteIDE主要特点:支持主流操作系统WindowsLinuxMacOSXGo编译环境管理和切换管理和切换多个Go编译环境支持Go语言交叉编译与Go标准一致的项目管理方式基于GOPAT
‘柒’ Golang 读文件为什么这么慢
mac下编译器默认编译的是mac os x的可执行文件。 编译centos上的可执行文件的时候需要交叉编译。 golang的交叉编译很容易,你的情况的话用下面这条命令 GOOS=linux GOARCH=amd64 go build ./文件
‘捌’ golang 在mac 下go install成二进制文件,上传到centos 无法执行
mac下编译器默认编译的是mac os x的可执行文件。
编译centos上的可执行文件的时候需要交叉编译。
golang的交叉编译很容易,你的情况的话用下面这条命令
GOOS=linux GOARCH=amd64 go build ./文件
‘玖’ golang保存二进制文件会有大小端问题吗
golang保存二进制文件会有大小端问题。
这个二进制文件的确有Big Endian 和Little Endian的问题,这个与CPU指令体系有关,不过不用操心,像JPEG就是Big Endian,其编解码就都是按照这个约定来完成的,没有平台问题,也没有大小端的问题。
编译centos上的可执行文件的时候需要交叉编译。golang的交叉编译很容易,你的情况的话用下面这条命令,GOOS=linux GOARCH=amd64 go build ./文件。
golang描述:
Go的语法接近C语言,但对于变量的声明有所不同。Go支持垃圾回收功能。Go的并行模型是以东尼·霍尔的通信顺序进程(CSP)为基础。
采取类似模型的其他语言包括Occam和Limbo,但它也具有Pi运算的特征,比如通道传输。在1.8版本中开放插件(Plugin)的支持,这意味着现在能从Go中动态加载部分函数。
与C++相比,Go并不包括如枚举、异常处理、继承、泛型、断言、虚函数等功能,但增加了 切片(Slice) 型、并发、管道、垃圾回收、接口(Interface)等特性的语言级支持。Go 2.0版本将支持泛型,对于断言的存在,则持负面态度,同时也为自己不提供类型继承来辩护。
‘拾’ Go 是怎么使用 Go 来编译自身的
第一步:all.bash
% cd $GOROOT/src
% ./all.bash
第一步有些突兀,因为 all.bash 仅仅调用了其它两个 shell 脚本;make.bash 和 run.bash。如果你在使用 Windows 或 Plan 9,过程是一样的,只是脚本扩展名变成了.bat 或.rc。对于本文中的其它脚本,请根据你的系统适当改动。
第二步:make.bash
. ./make.bash --no-banner
main.bash 来源于 all.bash,因此调用退出将正确终止便宜进程。main.bash 有三个主要工作,第一个是验证编译 Go 的环境是否完整。完整性检查在过去几年中建立,它通常尝试避免使用已知的破损工具或必然失败的环境进行编译。
第三步. cmd/dist
gcc -O2 -Wall -Werror -ggdb -o cmd/dist/dist -Icmd/dist cmd/dist/*.c
一旦可用性检查完毕,make.bash 将编译产生 cmd/dist,cmd/dist取代了之前存在于Go 1 之前的Makefile 编译系统。cmd/dist用来管理少量的pkg/runtime的代码生成。cmd/dist 是C语言编写的程序,能够充分利用系统C编译器和头文件来处理大部分主机系统平台的检测。cmd/dist通常用来检测主机的操作系统和体系结构,即环境变量$GOHOSTOS和$GOHOSTARCH .如果是交叉编译的话,变量 $GOOS和$GOARCH可能会由于你的设置而不同。事实上,Go 通常用作跨平台编译器,只不过多数情况下,主机和目标系统一致而已。接下来,make.bash 调用cmd/dist 的引导参数的支持库、 lib9、 libbio 和 libmach,使用编译器套件,然后用自己的编译器进行编译。这些工具也是用 C 语言写的中,但是由系统 C 编译器编译产生。
echo "# Building compilers and Go bootstrap tool for host, $GOHOSTOS/$GOHOSTARCH."
buildall="-a"
if [ "$1" = "--no-clean" ]; then
buildall=""
fi
./cmd/dist/dist bootstrap $buildall -v # builds go_bootstrap
使用的编译器套件 cmd/dist 编译产生一个版本的gotool,go_bootstrap。但go_bootstrap并不是完整得gotool,比方说 pkg/net 就是孤立的,避免了依赖于 cgo。要编译的文件的列表以及它们的依赖项,是由cmd/dist编译的 ,所以十分谨慎地避免引入新的生成依赖项 到 cmd/go。
第四步:go_bootstrap
现在, go_bootstrap 编译完成了,make.bash 的最后一部就是使用 go_bootstrap 完成 Go 标准库的编译,包括整套 gotool 的替换版。
echo "# Building packages and commands for $GOOS/$GOARCH."
"$GOTOOLDIR"/go_bootstrap install -gcflags "$GO_GCFLAGS" \
-ldflags "$GO_LDFLAGS" -v std
第五步:run.bash
现在,make.bash 完成了,运行回到了 all.bash,它将引用 run.bash。run.bash 的工作是编译和测试标准库,运行时以及语言测试套件。
bash run.bash --no-rebuild
使用 --no-rebuild 标识是因为 make.bash 和 run.bash 可能都调用了 go install -a std,这样可以避免重复,--no-rebuild 跳过了第二个 go install。
# allow all.bash to avoid double-build of everything
rebuild=true
if [ "$1" = "--no-rebuild" ]; then
shift
else
echo '# Building packages and commands.'
time go install -a -v std
echo
fi
第六步:go test -a std
echo '# Testing packages.'
time go test std -short -timeout=$(expr 120 \* $timeout_scale)s
echo
下一步 run.bash z则是对标准库中的所有包进行单元测试,这是使用 testing 包编写的。由于 $GOPATH 和 $GOROOT 中的代码存在于同一个命名空间中,我们不能使用 go test,这可能会测试 $GOPATH 中的所有包,所以将创建别名std来标识标准库中的包。由于有些测试需要很长时间,或耗用大量内存,测试将会通过 -short 标识将其过滤。
第七步 runtime 和 cgo 测试
run.bash的下一节将运行大量对cgo支持的平台测试,运行一些季春测试,编译 Go 附带的一些杂项程序。随着时间的推移,这份杂项程序列表已经变长了,当它们发现自己并不包含在编译过程中时,沉默将不可避免的被打破。
第八步: go run test
(xcd ../test
unset GOMAXPROCS
time go run run.go
) || exit $?
run.bash的倒数第二步调用了$GOROOT目录下test文件夹中的编译器和运行时测试。这其中有描述编译器和运行时本身的低层级测试。而子目录 test/bugs 及 test/fixedbugs 中的测试对已知问题和已解决问题进行特别的测试。所有测试的测试驱动器是 $GOROOT/test/run.go,该程序很小,它调用test文件夹中的每个.go 文件。有些 .go 文件在首行上描述了预期的运行结果,例如,程序失败或是放出特定的输出队列。
第九步go tool api
echo '# Checking API compatibility.'
go tool api -c $GOROOT/api/go1.txt,$GOROOT/api/go1.1.txt \
-next $GOROOT/api/next.txt -except $GOROOT/api/except.txt
run.bash的最后一部将调用API工具,API工具的作用是执行 Go 1 约定;导出的符号,常数,函数,变量,类型和方法组成2012年确认的 Go 1 API。Go 1 写在 api/go1.txt 文件,而 Go 1.1 则写在 api/go1.1.txt文件中。另一个额外的文件,api/next.txt 描述了G 1.1自后添加到标准库和运行时中的符号。当 Go 1.2 发布时,这个文件将会成为 Go 1.2 的约定,另一个新的 next.txt 文件也将被创建。这里还有一个小文件,except.txt,它包括 Go 1 约定中被批准的扩展。对文件的增添总是小心翼翼的。