栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

go语言生成c库

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

go语言生成c库

一,环境搭建

开发环境必须为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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/934615.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号