目的
go程序在一些方面编写优于C/C++,我们可以自己用go写一些小组件用C/C++调用。所以我们需要将go程序源代码编译成Linux平台下.a文件或者Window平台下的dll和lib文件。
环境
- golang:go程序必备环境
- gcc:编译成C语言需要用到的环境,windows下也需下载安装
- vs2015:在windows平台下从.dll文件导出.lib的环境(windows下也可以直接使用dll来运行程序,我习惯加上lib的方式)
步骤
1、编写一个go程序
我们编写一个名为godll.go的程序go
package main
import "C"
import (
"fmt"
)
//export IntAdd
func IntAdd(a int32,b int32) int32{
return a+b
}
//export GoPrint
func GoPrint(str string){
fmt.Print(str)
}
func main() {
}
这个程序需要注意几点:
- 程序注释不能有中文
- package main和func main()必须有,导出的包必须是含有main的
- 导出的函数前面用//export +函数名声明,表示需要导出该函数
- 引用包import "C"
2、编译go程序
**Linux下**
我们使用go build命令编译此程序,命令格式为
go build -buildmode=c-archive goflie.go //替换gofile.go为编译的文件名
执行之后我们会得到.a文件和.h文件,到此Linux下我们就算完成了。接下来步骤都是针对Windows下的
**Windows下**
我们使用go build命令编译此程序,命令格式为
go build -buildmode=c-shared -o gofile.dll gofile.go //替换gofile为编译的文件名
编译后得到 .dll 和 .h 两个文件。其实windows下此时我们也算完成了,但是我习惯使用有静态库的方式,所以接下来主要利用dll生成lib
3、生成lib文件
从dll文件生成lib文件的过程我们需要一个def文件,def文件中描述的是导出的函数列表。因为我们知道dll文件中导出函数列表所以我们可以直接新建一个def文件手写。
新建一个def文件,用编辑器打开此文件,添加需要导出的函数列表
LIBRARY
EXPORTS
IntAdd
GoPrint
注意函数名的书写一定要和导出函数一样
有了def文件我们就可以生成lib文件了,此时我们需要使用vs2015提供的lib.exe文件(路径:C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin)。
首先将lib.exe所在目录添加到环境变量的path目录下,然后在cmd下执行以下命令
生成目标64位的命令格式:
lib /def:deffile.def /machine:x64 /out:libfile.lib
生成目标32位的命令格式:
lib /def:deffile.def /machine:x86 /out:libfile.lib
此时lib文件生成就完成了
测试
根据生成的h,dll,lib文件我们使用C/C++测试,新建main.cpp在下面添加代码
#include <stdio.h>
#include "godll.h"
#include <string>
#pragma comment(lib,"goDll.lib")
GoString StringToGostring(std::string str)
{
GoString gostr;
gostr.p = str.data();
gostr.n = str.length();
return gostr;
}
int main()
{
GoInt res = IntAdd(5, 4);
printf("add(5,4)=%d\n", res);
GoPrint(StringToGostring("Test"));
getchar();
return 0;
}
编译发现会出错,此时我们需要注释头文件下的三行代码
//typedef __SIZE_TYPE__ GoUintptr;
//typedef float _Complex GoComplex64;
//typedef double _Complex GoComplex128;
编译通过,大功告成!!!
参考:https://blog.csdn.net/qq_30549833/article/details/86157744