热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C/C++调用Golang一

CC++调用Golang一(开发环境:操作系统:windows732位操作系统C++:visualstudio2010Golang:go

C/C++调用Golang

 

 

(开发环境:

  1. 操作系统: windows 7 32位操作系统  
  2. C++visual studio 2010   
  3. Golanggo version go1.9 windows/386   TDM-GCC-32

 

 

用一个简单的例子演示如何在C++中调用golang程序。用golang编写一个简单的函数,编译成动态链接库,然后在C++中调用该go函数。

 

第一阶段 Golang代码编译成动态链接库 (涉及2个文件 main.gogodll.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.hgodll.dllC++工程需要的,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  

 

创建名为callgovs 2010工程,将godll.h加入到工程,新建main.cpp的源文件:

 

#include 

#include 

#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编译时会报符号未定义的错误:

 


推荐阅读
  • 如何搭建Java开发环境并开发WinCE项目
    本文介绍了如何搭建Java开发环境并开发WinCE项目,包括搭建开发环境的步骤和获取SDK的几种方式。同时还解答了一些关于WinCE开发的常见问题。通过阅读本文,您将了解如何使用Java进行嵌入式开发,并能够顺利开发WinCE应用程序。 ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
  • Python脚本编写创建输出数据库并添加模型和场数据的方法
    本文介绍了使用Python脚本编写创建输出数据库并添加模型数据和场数据的方法。首先导入相应模块,然后创建输出数据库并添加材料属性、截面、部件实例、分析步和帧、节点和单元等对象。接着向输出数据库中添加场数据和历程数据,本例中只添加了节点位移。最后保存数据库文件并关闭文件。文章还提供了部分代码和Abaqus操作步骤。另外,作者还建立了关于Abaqus的学习交流群,欢迎加入并提问。 ... [详细]
  • 本文介绍了使用Rust语言编写、保存和编译程序的简单步骤。首先,打开记事本文件并编写程序代码,然后将代码保存到一个以.rs为扩展名的文件中。接下来,使用rustc命令来编译运行程序。最后,通过命令行运行编译后的程序,得到输出结果。如果遇到编译错误,可以下载Build Tools for Visual Studio 2017来解决。 ... [详细]
  • 1、工具VS2015OpenCV3.20下载地址:https:sourceforge.netprojectsopencvlibrary2、步骤1.下载工具ÿ ... [详细]
  • Introduction(简介)Forbeingapowerfulobject-orientedprogramminglanguage,Cisuseda ... [详细]
  • 原文地址http://balau82.wordpress.com/2010/02/28/hello-world-for-bare-metal-arm-using-qemu/最开始时 ... [详细]
  • FIN7后门工具伪装成白帽工具进行传播
    fin7,后门,工具,伪装,成,白, ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • svnWebUI:一款现代化的svn服务端管理软件
    svnWebUI是一款图形化管理服务端Subversion的配置工具,适用于非程序员使用。它解决了svn用户和权限配置繁琐且不便的问题,提供了现代化的web界面,让svn服务端管理变得轻松。演示地址:http://svn.nginxwebui.cn:6060。 ... [详细]
  • 本文介绍了Python语言程序设计中文件和数据格式化的操作,包括使用np.savetext保存文本文件,对文本文件和二进制文件进行统一的操作步骤,以及使用Numpy模块进行数据可视化编程的指南。同时还提供了一些关于Python的测试题。 ... [详细]
  • 本文记录了作者对x265开源代码的实现与框架进行学习与探索的过程,包括x265的下载地址与参考资料,以及在Win7 32 bit PC、VS2010平台上的安装与配置步骤。 ... [详细]
  • VSCode快速查看函数定义和代码追踪方法详解
    本文详细介绍了在VSCode中快速查看函数定义和代码追踪的方法,包括跳转到定义位置的三种方式和返回跳转前的位置的快捷键。同时,还介绍了代码追踪插件的使用以及对符号跳转的不足之处。文章指出,直接跳转到定义和实现的位置对于程序员来说非常重要,但需要语言本身的支持。以TypeScript为例,按下F12即可跳转到函数的定义处。 ... [详细]
author-avatar
电信学院团总支沈天宇
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有