编译

编译

一步编译: 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()
}
posted @ 2019-12-25 22:31  慕沁  阅读(359)  评论(0)    收藏  举报