开发环境必须为gcc,windows需要安装mingw
二,示例代码//必须是main包,并且导入 “C”
package main
import "C"
//改注释必须存在,格式为export+空格+函数名
//export Sum
func Sum(a,b int) int {
return a+b
}
//export Show
func Show(str *C.char) *C.char {
return C.CString("1233")
}
//必须存才main函数
func main() {
}
三,编译以及使用过程
1,生成动态库
go build -buildmode=c-shared -o lib.dll
2,使用vs2019调用打开vs2019的Developer Command Prompt for vs2019命令行,并进入1,中生成的Dll文件所在目录,编写.def文件,该文家文件名必须和动态库同名
lib.def文件如下
LIBRARY
EXPORTS
Sum
Show
使用一下命令来生成.lib文件
生成目标64位的命令格式:
lib /def:lib.def /machine:x64 /out:lib.lib
生成目标32位的命令格式:
lib /def:lib.def /machine:x86 /out:lib.lib
之后就可以像正常的动态库使用了。测试代码如下
#include#include "add.h" int main() { GoInt val = Sum(3,1); printf("%ldn",val); return 0; }
注意:1,中生成的头文件,必须将如下几行注释掉否则会报错
#line 1 "cgo-builtin-export-prolog" #include#ifndef GO_CGO_EXPORT_PROLOGUE_H #define GO_CGO_EXPORT_PROLOGUE_H #ifndef GO_CGO_GOSTRING_TYPEDEF typedef struct { const char *p; ptrdiff_t n; } _GoString_; #endif #endif #line 2 "add.go" #include #line 1 "cgo-generated-wrapper" #line 1 "cgo-gcc-export-header-prolog" #ifndef GO_CGO_PROLOGUE_H #define GO_CGO_PROLOGUE_H typedef signed char GoInt8; typedef unsigned char GoUint8; typedef short GoInt16; typedef unsigned short GoUint16; typedef int GoInt32; typedef unsigned int GoUint32; typedef long long GoInt64; typedef unsigned long long GoUint64; typedef GoInt64 GoInt; typedef GoUint64 GoUint; //typedef __SIZE_TYPE__ GoUintptr;该行必须注释 typedef float GoFloat32; typedef double GoFloat64; //typedef float _Complex GoComplex64;该行必须注释 //typedef double _Complex GoComplex128;该行必须注释 //typedef char _check_for_64_bit_pointer_matching_GoInt[sizeof(void*)==64/8 ? 1:-1];该行必须注释 #ifndef GO_CGO_GOSTRING_TYPEDEF typedef _GoString_ GoString; #endif typedef void *GoMap; typedef void *GoChan; typedef struct { void *t; void *v; } GoInterface; typedef struct { void *data; GoInt len; GoInt cap; } GoSlice; #endif #ifdef __cplusplus extern "C" { #endif extern GoInt Sum(GoInt a, GoInt b); extern char* Show(char* str); #ifdef __cplusplus } #endif



