直接嵌入c源代码到go代码里面
成都创新互联-专业网站定制、快速模板网站建设、高性价比偏关网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式偏关网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖偏关地区。费用合理售后完善,十多年实体公司更值得信赖。
package main
/*
#include stdio.h
void myhello(int i) {
printf("Hello C: %d\n", i);
}
*/
import "C"
import "fmt"
func main() {
C.myhello(C.int(12))
fmt.Println("Hello Go");
}
需要注意的是C代码必须放在注释里面
import "C"语句和前面的C代码之间不能有空行
运行结果
$ go build main.go ./main
Hello C: 12
Hello Go
分开c代码到单独文件
嵌在一起代码结构不是很好看,很多人包括我,还是喜欢把两个分开,放在不同的文件里面,显得干净,go源文件里面是go的源代码,c源文件里面是c的源代码。
$ ls
hello.c hello.h main.go
$ cat hello.h
void hello(int);
$ cat hello.c
#include stdio.h
void hello(int i) {
printf("Hello C: %d\n", i);
}
$ cat main.go
package main
// #include "hello.h"
import "C"
import "fmt"
func main() {
C.hello(C.int(12))
fmt.Println("Hello Go");
}
编译运行
$ go build ./main
Hello C: 12
Hello Go
编译成库文件
如果c文件比较多,最好还是能够编译成一个独立的库文件,然后go来调用库。
$ find mylib main
mylib
mylib/hello.h
mylib/hello.c
main
main/main.go
编译库文件
$ cd mylib
# gcc -fPIC -shared -o libhello.so hello.c
编译go程序
$ cd main
$ cat main.go
package main
// #cgo CFLAGS: -I../mylib
// #cgo LDFLAGS: -L../mylib -lhello
// #include "hello.h"
import "C"
import "fmt"
func main() {
C.hello(C.int(12))
fmt.Println("Hello Go");
}
$ go build main.go
运行
$ export LD_LIBRARY_PATH=../mylib
$ ./main
Hello C: 12
Hello Go
在我们的例子中,库文件是编译成动态库的,main程序链接的时候也是采用的动态库
$ ldd main
linux-vdso.so.1 = (0x00007fffc7968000)
libhello.so = ../mylib/libhello.so (0x00007f513684c000)
libpthread.so.0 = /lib64/libpthread.so.0 (0x00007f5136614000)
libc.so.6 = /lib64/libc.so.6 (0x00007f5136253000)
/lib64/ld-linux-x86-64.so.2 (0x000055d819227000)
理论上讲也是可以编译成整个一静态链接的可执行程序,由于我的机器上缺少静态链接的系统库,比如libc.a,所以只能编译成动态链接。
Go1.5开发环境依赖Go1.4版本作为引导,因为Go1.5使用Go本身来编译安装Go,所以必须保证服务器上已经安装Go1.4,这完全是为了解决先有鸡还是先有蛋的问题,当然如果你想避免编译安装1.4也可以直接使用二进制包。
在这里假设你希望将go1.5安装到$HOME/go1.5目录下,只需要以下几步:
下载Go1.5的源码放到$HOME/go1.5目录下
在安装Go1.5之前需要将Go1.4放到$HOME/go1.4下面或者export GOROOT_BOOTSTRAP=/go1.4安装目录/
到$HOME/go1.5/src/下执行all.bash即可
我习惯将软件安装至/usr/local/下,以下为我安装Go1.5(/usr/local/go1.5)的步骤:
wget
tar zxvf go1.5.1.src.tar.gz
mv ./go /usr/local/go1.5
wget
tar zxvf go1.4.3.src.tar.gz
mv ./go /usr/local/go-bootstrap1.4/
cd /usr/local/go-bootstrap1.4/src
./all.bash //编译安装Go1.4,有可能test不通过,只要编译通过,test可忽略,目的是需要go1.4的二进制包来编译1.5
cd /usr/local/go1.5/src
GOROOT_BOOTSTRAP=/usr/local/go-bootstrap1.4 ./all.bash
//可在环境变量中添加GOROOT_BOOTSTRAP,然后再编译Go1.5
以下为网摘:
From C to Go
The gc tool chain is being converted from C to Go.
An ongoing process, started early 2014.
Russ Cox says "It'll be done by March [2015]."
New link tool to replace 6l, 8l, etc.
New asm tool to replace 6a, 8a, etc.
Machine-translated gc to replace 6g, 8g, etc.
Design doc:
golang.org/s/go13compiler
Go 1.5 will have no C code in the tool chain or runtime.
Go语言将使用Go代替C重写运行时环境
Go 1.4 的合并窗口在 9 月份将关闭,从现在开始到12月份发布 Go 1.4 之前将只接受 bug 修复和小调整。
Go 1.4 最主要的变化是将使用 Go 语言本身来重写 Go 的运行时,而之前是采用 C 语言开发。这也是为什么 Go 的发行版中包含一个 C
编译器的原因。
使用 Go 重写的好处是:
当前如果在 Goroutine 的调用堆栈中发现 C 代码,runtime 将在需要增长堆栈时回滚到老的堆栈方法。如果使用 Go 来重写
runtime,那么堆栈拷贝的方法就会更加高效
目前转换工作只计划转 Go 编译器 (5g, 6g, 8g), 而不是 C 编译器,降低运行时中的 C 代码行数,甚至可能完全清除
注意
这是 golang.org 分发版,也就是 gc ,而不是 gccgo
这是不同的 C 编译器,gc 工具链将使用你系统的 C 编译器来编译,gc 运行时则使用它的 C 编译器来编译
8月20日后增加的转换行可能跟 this request 有关.
Go语言将使用Go代替C重写运行时环境
— 从现在开始到12月份 Go 1.4版本发布前,Go将只接受Bug修复和小范围的调整,Go
1.4版本将实现使用Go语言来重写Go的运行时环境。
1.mac肯定是brew安装啦
配置文件在/etc/influxdb/influxdb.conf ,如果没有就将/usr/local/etc/influxdb.conf 拷一个过去
cache-max-memory-size是用来配置缓存的
2.启动客户端
3.基本操作
mac下编译器默认编译的是mac os x的可执行文件。
编译centos上的可执行文件的时候需要交叉编译。
golang的交叉编译很容易,情况用下面这条命令 GOOS=linux GOARCH=amd64 go build ./文件