编译
编译 一步编译: gcc -o hello.exe code.c 分步编译: gcc -E hello.c -o hello.i gcc -S hello.i -o hello.s gcc -c hello.s -o hello.o gcc hello.o -o hello.exe -E 预处理,去掉注释 头文件展开 宏定义展开条件编译 -S 预处理和编译,检查语法,将源码文件转成汇编语言 -c 汇编,将汇编语言转成二进制语言 # 将go语言程序系那是为汇编代码 go build -gcflags "-N -l" go tool objdump -s 'main.Demo' -S ./src Go语言本身支持使用CGO与C语言混合编程 go build 编译项目,使其打包成可运行程序,配合参数可以进行交叉编译 标准格式 go build [-o output] [-i] [build flags] [packages] -o 参数决定了编译后文件名称,例如我们要程序main.go编译后程序名为hello,我们可以执行以下命令 go build -o hello main.go -i install 安装作为目标的依赖关系的包(用于增量编译提速),一般很少使用。 编译参数一般并不会添加,以下列举几个,详细信息可以使用go help build 获取 附加参数 备注 -v 编译时显示包名 -p n 开启并发编译,默认情况下该值为 CPU 逻辑核数 -a 强制重新构建 -n 打印编译时会用到的所有命令,但不真正执行 -x 打印编译时会用到的所有命令 packages 所编译的包名,如果不填写默认为编译当前路径下的入口文件,文件名称默认为当前文件夹名称 交叉编译 go语言向下支持C语言,可以在go语言中直接编写C语言代码 但是在编译时,必须支持C语言 Mac上编译Linux可执行二进制文件 CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go Mac上编译Windows可执行二进制文件 CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build main.go Linux上编译Mac可执行二进制文件 CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build main.go Linux上编译Windows可执行二进制文件 CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build main.go Windows上编译Mac可执行二进制文件 SET CGO_ENABLED=0 SET GOOS=darwin SET GOARCH=amd64 go build main.go Windows上编译Linux可执行二进制文件 SET CGO_ENABLED=0 SET GOOS=linux SET GOARCH=amd64 go build main.go 交叉编译参数含义 CGO_ENABLED 是否使用cgo编译,0为不使用,1为使用,使用cgo进行交叉编译时需要编译机器安装对应的cgo程序 GOOS 目标操作系统标识,windows对应Windows操作系统exe可执行文件,darwin对应Mac可执行文件,linux对应Linux可执行文件,freebsd对应UNIX系统 GOARCH 目标可执行程序操作系统构架,包括 386,amd64,arm go build 后接所编译程序的入口文件 go test Go语言自带的测试工具,会自动读取源码目录下面名为 *_test.go 的文件,生成并运行测试用的可执行文件 原则 文件名必须是 _test.go 结尾的,这样在执行 go test 的时候才会执行到相应的代码 必须 import testing 这个包 可执行测试 原则 所有的测试用例函数必须是 Test 开头 测试用例会按照源代码中写的顺序依次执行 测试函数 TestXxx() 的参数是 testing.T ,我们可以使用该类型来记录错误或者是测试状态 测试格式: func TestXxx (t *testing.T) , Xxx 部分可以为任意的字母数字的组合,但是首字母不能是小写字母[a-z] 函数中通过调用 testing.T 的 Error, Errorf, FailNow, Fatal, FatalIf 方法,说明测试不通过,调用 Log 方法用来记录测试的信息。
package main /* #include "stdio.h" void xrint() { int a = 3; printf("hello world1\n"); printf("hello world2\n"); } */ import "C" func demo() { //调用C语言函数 C.xrint() } func ma1in() { demo() }