C/C++调用Golang 一
来源:互联网 发布:手机理财软件哪个好 编辑:程序博客网 时间:2024/05/22 12:12
(开发环境:
- 操作系统: windows 7 32位操作系统
- C++: visual studio 2010
- Golang:go version go1.9 windows/386 TDM-GCC-32)
用一个简单的例子演示如何在C++中调用golang程序。用golang编写一个简单的函数,编译成动态链接库,然后在C++中调用该go函数。
第一阶段 将Golang代码编译成动态链接库 (涉及2个文件 main.go和godll.def)
Golang : main.go 一个简单的Add函数
package main
import "C"
//export Add
func Add(a, b int32) int32 {
return a + b
}
func main() {}
为动态链接库指定导出符号,创建godll.def
EXPORTS
Add
将main.go编译成动态链接库,在命令行中执行如下操作:
go build -buildmode=c-archive
go build 生成了两个文件:godll.a godll.h
再执行 gcc -m32 -shared -o godll.dll godll.def godll.a -static -lwinmm -lWs2_32
(需要安装 TDM-GCC-32)
编译后生成 godll.dll
godll.h和godll.dll是C++工程需要的,godll.h的内容如下:
/* Created by "go tool cgo" - DO NOT EDIT. */
/* package _/Y_/godll */
/* Start of preamble from import "C" comments. */
/* End of preamble from import "C" comments. */
/* Start of boilerplate cgo prologue. */
#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 GoInt32 GoInt;
typedef GoUint32 GoUint;
typedef __SIZE_TYPE__ GoUintptr;
typedef float GoFloat32;
typedef double GoFloat64;
typedef float _Complex GoComplex64;
typedef double _Complex GoComplex128;
/*
static assertion to make sure the file is being used on architecture
at least with matching size of GoInt.
*/
typedef char _check_for_32_bit_pointer_matching_GoInt[sizeof(void*)==32/8 ? 1:-1];
typedef struct { const char *p; GoInt n; } GoString;
typedef void *GoMap;
typedef void *GoChan;
typedef struct { void *t; void *v; } GoInterface;
typedef struct { void *data; GoInt len; GoInt cap; } GoSlice;
#endif
/* End of boilerplate cgo prologue. */
#ifdef __cplusplus
extern "C" {
#endif
extern GoInt32 Add(GoInt32 p0, GoInt32 p1);
#ifdef __cplusplus
}
#endif
extern GoInt32 Add(GoInt32 p0, GoInt32 p1); 是导出函数的签名。
用depends22_x86 查看 godll.dll
第二阶段 在C++工程中调用godll.dll
创建名为callgo的vs 2010工程,将godll.h加入到工程,新建main.cpp的源文件:
#include <Windows.h>
#include <stdio.h>
#include "godll.h"
typedef GoInt32 (*funcPtrAdd)(GoInt32 p0, GoInt32 p1);
int main(){
HMODULE h = LoadLibraryA("godll.dll");
if (NULL == h || INVALID_HANDLE_VALUE == h)
{
return -1;
}
funcPtrAdd pfAdd = (funcPtrAdd)GetProcAddress(h,"Add");
if (pfAdd)
{
GoInt32 result = pfAdd(5,4);
printf("Add(5,4) = %d",result);
}
FreeLibrary(h);
return 0;
}
将godll.h中的三行注释掉
//typedef __SIZE_TYPE__ GoUintptr;
typedef float GoFloat32;
typedef double GoFloat64;
//typedef float _Complex GoComplex64;
//typedef double _Complex GoComplex128;
编译运行,结果如下图:
注意事项:
main.go中 import "C" 这一行一定要有,否则gcc编译时会报符号未定义的错误:
- C/C++调用Golang 一
- Golang里调用C
- golang中调用C
- C/C++调用Golang 二
- GoLang之调用C接口的使用方法
- centos6使用 swig3.0.6 编译c,golang 1.4.2调用
- golang之cgo---调用C/C++动态库函数
- golang调用c++dll 获取mac地址,用户名,内存大小
- golang之cgo一---go与C基本类型转换
- Keil C调用汇编(一)
- Golang与C互用以及调用C的so动态库和a静态库
- CGO,GOLANG调用C库,调用代码、静态库或动态库
- Golang生成共享库(shared library)以及Golang生成C可调用的动态库.so和静态库.a
- zeromq:c,c++,golang及nodejs使用
- jni/C/CPP调用示例(一)
- 一、Java调用C/C++代码
- C语言函数调用栈一
- Thrift 的C与golang语言实现以及相互调用方式
- 学习日记12-06
- 2017年12月7日 JAVA笔记
- linux 常用命令全称
- 理解并设计rest/restful风格接口
- jsp自定义标签
- C/C++调用Golang 一
- C/C++调用Golang 二
- 一篇真正教会你开发移动端页面的文章(一)
- 物联网前端后台1——一条硬件狗的学习历程
- java-List(LinkedList)
- 数据结构复习资料
- 面向对象:世界上最奢侈的,是人与人的关系
- Activity的四种状态
- 最新高清IT职业技能图谱(15图)