两个流行的Go编译器"gc"和"gccgo"之间的主要区别是什么?建立表现?运行时性能?命令行选项?授权?
我不是在寻找最好的意见,只是对他们差异的基本概述,所以我可以决定哪种方法最符合我的需求.
可以用Go for iPhone写吗?我认为需要采取以下步骤
编译Go作为ARM Mach-O二进制文件(我希望GCCGO能够做到这一点)
将iPhone应用程序编译为静态库(我认为可以重命名main() - > main2()等)
将Go编译为与iPhone静态库链接的Mach-O二进制文件.Go必须调用main2.
制作一些plist文件,zip,sign
我试图说服gccgo没有成功矢量化以下片段:
package foo
func Sum(v []float32) float32 {
var sum float32 = 0
for _, x := range v {
sum += x
}
return sum
}
Run Code Online (Sandbox Code Playgroud)
我正在验证由以下内容生成的程序集:
$ gccgo -O3 -ffast-math -march=native -S test.go
Run Code Online (Sandbox Code Playgroud)
gccgo版本是:
$ gccgo --version
gccgo (Ubuntu 4.9-20140406-0ubuntu1) 4.9.0 20140405 (experimental) [trunk revision 209157]
Run Code Online (Sandbox Code Playgroud)
是不是gccgo应该能够对这段代码进行矢量化?具有相同gcc选项的等效C代码完全使用AVX指令进行矢量化...
UPDATE
在这里你有相应的C例子:
#include <stdlib.h>
float sum(float *v, size_t n) {
size_t i;
float sum = 0;
for(i = 0; i < n; i++) {
sum += v[i];
}
return sum;
} …Run Code Online (Sandbox Code Playgroud) 当尝试在Precise上与gccgo链接时,我收到此链接错误:
matt@matt-1005P:~/src/gopath/src/meme$ gccgo cmd/meme/main.go -o meme
/usr/bin/ld: cannot find -lgcc_s
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
有报告称此错误,但没有干净的解决方案.我如何解决它?
gccgo(Ubuntu/Linaro 4.7.0-0ubuntu4)4.7.0
Linux matt-1005P 3.2.0-24-generic-pae#38-Ubuntu SMP Tue May 1 16:40:26 UTC 2012 i686 i686 i386 GNU/Linux
我几天前就开始研究Go了,它来自CGO的东西和gccgo编译器.根据我的理解,这允许使用Go编译器编译Go程序并使用C编译器编译C库并从Go程序内引用这些库.这对我来说非常有趣,因为这使我们可以从主程序中利用C的性能(如果需要),而且开销很小.
但是我不确定那是多么的少,所以我在这里问:
是否有创建C库的情况只是为了在Go应用程序中使用它?或者此功能仅用于促进现有C代码的重用性?
PS:我认为目前CGO不支持C++,但是有人发表了一篇能够使用C函数包装C++代码并成功调用它们的帖子.
我注意到使用go build二进制结果时可能超过2MB; 但使用gccgo二进制文件小于35k.
我在使用时注意到的另一个问题gccgo是生成的二进制文件不能在另一个Linux机器上运行(libgo.so我不相信)但是go build二进制文件运行得很好(所以我想它是因为二进制文件包含了运行所需的全部内容吗?); 有没有办法做到这一点gccgo?
即将发布的Go 1.5版本附带了新的构建模式,允许导出Go符号从C代码链接和调用.我一直在玩它并得到基本的"Hello world"示例,但是现在我正在尝试链接一个Go库,它启动了net/http.Server它并且它失败了.代码看起来像这样(它也可以在这里获得):
gohttplib.go:
package main
import "C"
import "net/http"
//export ListenAndServe
func ListenAndServe(caddr *C.char) {
addr := C.GoString(caddr)
http.ListenAndServe(addr, nil)
}
func main() {}
Run Code Online (Sandbox Code Playgroud)
实例/ C/main.c中:
#include <stdio.h>
#include "../../gohttplib.h"
int main()
{
ListenAndServe(":8000");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
生成静态链接的对象和标头工作正常:
$ go build -buildmode=c-archive
Run Code Online (Sandbox Code Playgroud)
但是编译它是失败的:
$ gcc -o gohttp-c examples/c/main.c gohttplib.a -lpthread
Undefined symbols for architecture x86_64:
"_CFArrayGetCount", referenced from:
_FetchPEMRoots in gohttplib.a(000003.o)
"_CFArrayGetValueAtIndex", referenced from:
_FetchPEMRoots in gohttplib.a(000003.o)
"_CFDataAppendBytes", referenced from:
_FetchPEMRoots in gohttplib.a(000003.o) …Run Code Online (Sandbox Code Playgroud) git2go在将1.4.2升级到1.5之后,我在将OS X上的库编译为linux amd64时遇到了问题.
我认为这是关于交叉编译任何使用C代码和go 1.5的应用程序.
使用CGO_ENABLED=1,我得到:
$ CGO_ENABLED=1 GOOS=linux GOARCH=amd64 ./script/with-static.sh go install ./...
# runtime/cgo
ld: unknown option: --build-id=none
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Run Code Online (Sandbox Code Playgroud)
使用-compiler=gccgo,我得到:
$ GOOS=linux GOARCH=amd64 ./script/with-static.sh go install -compiler gccgo ./...
go build github.com/libgit2/git2go: : fork/exec : no such file or directory
Run Code Online (Sandbox Code Playgroud)
如果没有提供任何这些,我得到:
$ GOOS=linux GOARCH=amd64 ./script/with-static.sh go install ./...
can't load package: package github.com/libgit2/git2go: C source files not allowed when not …Run Code Online (Sandbox Code Playgroud) 现在,我有了 bash 代码,它可以使用 go 工具中的链接器在编译时将版本值导入到 go 源代码中。这段代码可以通过GC正常运行。
go build -ldflags“-X 某事:某事” main.go
但我正在机器上测试我的代码,其架构仅支持gccgo而不支持gc,并且gccgo不支持-ldflags,这是gc中的链接器工具。虽然 gccgo 有标志选项 -gccgoflags,但我没有看到我需要的链接标志。
我想知道 gccgo 中是否有任何相对标志或者是否有其他方法可以将值插入到源代码中?
我不想用 bash 硬编码这个功能。
谢谢。
我一直在试验gc和gccgo,我遇到了一些奇怪的行为.
使用我曾编写的程序来测试一些定理,我得到了这些结果:(我删除了不必要的信息以获得可读性)
$ time go build -compiler gc -o checkprog_gc checkprog.go (x 3)
go build <...> 0.13s user 0.02s system 100% cpu 0.149 total
go build <...> 0.13s user 0.01s system 99% cpu 0.148 total
go build <...> 0.14s user 0.03s system 100% cpu 0.162 total
--> average: 0.13s user 0.02s system 100% cpu 0.153 total
$ time go build -compiler gccgo -o checkprog_gccgo checkprog.go (x 3)
go build <...> 0.10s user 0.03s system 96% cpu 0.135 total …Run Code Online (Sandbox Code Playgroud)