glibc编译小记

闲来无事,尝试编译一下glibc。 编译注意事项 glibc可以说是Linux系统最根本的库了,基本上除了Linux自身的API以外,所有的库都...

February 12, 2019

Go语言与C协作的两种方式

任何语言想作为系统编程语言,就必须能够和作为系统语言之母的C语言来打交道,Go语言也不例外。那么它如何与C协作呢? 目前有两种方式,一是通过cgo,二是通过gcc。这两种方式的思路不同,第一种是同时把C语言化成Go来使用,第二种是通过把Go语言化成GCC的中间语言来使用。 cgo cgo的作用有点像swig,将把C语言的结构体和函数包装成Go语言可以使用的结构体和函数。下面是cgo版的hello,world!的例子: 使用下面的命令(Go 1.5)编译成可以在Windows执行的代码: 简单解释一下上面的代码,在import "C"之前注释里的代码会被当成是C代码,Go会生成相关的文件,然后调用C语言编译器将其编译成目标文件,最后链接成一个可执行文件hi.exe。执行hi.exe后就见到了熟悉的Hello, world! gccgo gccgo是Go语言和C协作的另一种方式。在GCC中Go语言被当作一种前端语言,由一个前端处理器来将其转化为中间代码,这个前端处理器就是gccgo。GCC有多个前端,比如常见的C/C++以及不常见的Ada/Obj-C等等。这些前端语言转化生成中间代码以后,可以被链接在一起,生成统一的可执行文件。 使用gccgo的巨大好处是GCC的一整套工具链可供Go语言使用,特别是gdb可以用来调试Go代码。有了这套工具链,Go和其他C库或者二进制代码集成也就变方便了。 gccgo随GCC发布,而不包括在Go的发行版中,根据Go的文档,GCC 4.9将包含完整的Go1.2的实现。 参考

September 7, 2015