简要步骤:

1,将c++ 的方法提取到头文件.h中( )

2,编译cc(c++)文件为动态链接库so文件  gcc -fPIC -shared hello.c -o libhello.so

3,将头文件放入include目录 .so放入lib目录

4,go程序中指定 CFLAGS 和 LDFLAGS

#cgo  CFLAGS:  -I  ./include 
#cgo  LDFLAGS:  -L .b  -lhello   -Wl,-rpath,/usr/localb  

5,运行(go 程序的时候)发布时候指定 export LD_LIBRARY_PATH="lib文件所在目录" (`pwd`)

export LD_LIBRARY_PATH=./lib

目录结构:

|-project
| |-lib
| | |-libhello.so
| |-include
| | |-hello.h
| |-src
| | |-main.go
| |-pkg
| |-bin

编译为so文件

g++ -g -Wall -lssl -lcrypto -c decrypter.cc -fPIC -shared -o libdecrypter.so

go文件:

 package main  

/*
#cgo CFLAGS: -I ./include
#cgo LDFLAGS: -L ./lib -lhello
#include "hello.h"
*/
import "C"
func main() { C.hello(C.CString("call C hello func"))
}

hello.c

#include "hello.h"
#include <stdio.h> void hello(const char *str)
{
printf("%s(%d): %s\n", __FUNCTION__, __LINE__, str);
}

hello.h

#ifndef ___HELLO___
#define __HELLO___
void hello(const char *str);
#endif

编译: go build main.go

编译如果出错:

# command-line-arguments
/tmp/go-build471704263/command-line-arguments/_obj/xx.cgo2.o: In function `_cgo_7f644bb4ca7c_Cfunc_xxxx':
请一定检查so文件是否为libxxx.so 
 
编译如果报错 could not determine kind of name for C.xxx
请检查 import "C" 是不是紧挨着 go顶部头文件c++ 部分注释代码
 

运行:  ./main

运行如果出现:     error while loading shared libraries: xxx.so: cannot open shared object file: No such file or directory

请一定要 export LD_LIBRARY_PATH="动态链接文件所在目录"

其他说明:golang的注释中直接写函数内容的方式只支持c不支持C++

package main
//!!!!以下为c代码不支持c++
/*
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void hello(const char *str)
{
printf("===> %s(%d): %s\n", __FUNCTION__, __LINE__, str);
}
*/
import "C" func main() { C.hello(C.CString("call C hello func"))
}

参考文章:golang的cgo支持调用C++的方法

golang之cgo---调用C/C++动态库函数

http://doumadou.github.io/golangdiao-yong-ccfang-fa.html  (需要步骤五才能运行成功)

附件:下载

golang调用c++文件的更多相关文章

  1. golang调用c++的dll库文件

    最近使用golang调用c++的dll库文件,简单了解了一下,特作此笔记:一.DLL 的编制与具体的编程语言及编译器无关 dll分com的dll和动态dll,Com组件dll:不管是何种语言写的都可以 ...

  2. Golang调用windows下的dll动态库中的函数 Golang 编译成 DLL 文件

    Golang调用windows下的dll动态库中的函数 package main import ( "fmt" "syscall" "time&quo ...

  3. 全面总结: Golang 调用 C/C++,例子式教程

    作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblogs.com/linguan ...

  4. golang生成c-shared so供c语言或者golang调用到例子

    1.golang生成c-shared类型到so 建立文件夹hello,创建main.go文件,内容如下 package main import "C" func main() {} ...

  5. LevelDB性能测试|Golang调用LevelDB

    LevelDB性能测试|Golang调用LevelDB 不同方式使用压力测试 用ssdb,TCP连接方式调用,底层存储levelDB 直接调用Cgo的levelDB (必须保证串行) 直接调用Gola ...

  6. Golang 调用 C/C++,例子式教程

    大部分人学习或者使用某样东西,喜欢在直观上看到动手后的结果,才会有继续下去的兴趣. 前言: Golang 调用 C/C++ 的教程网上很多,就我目前所看到的,个人见解就是比较乱,坑也很多.希望本文能在 ...

  7. golang调用c动态库

    golang调用c动态库 简介 golang调用c语言动态库,动态方式调用,可指定动态库路径,无需系统目录下 核心技术点 封装c动态库 go语言调用c代码 实例代码 封装c动态库 头文件 test_s ...

  8. Golang 调用 aws-sdk 操作 S3对象存储

    Golang 调用 aws-sdk 操作 S3对象存储 前言 因为业务问题,要写一个S3对象存储管理代码,由于一直写Go,所以这次采用了Go,Go嘛,快,自带多线程,这种好处就不用多说了吧. 基础的功 ...

  9. Golang调用Dll案例

    Golang调用Dll案例 前言 在家办公已经两个多星期了,目前最大的困难就是网络很差.独自一个人用golang开发调用dll的驱动程序.本来就是半桶水的我,还在为等待打开一个页面而磨平了耐心.本想依 ...

随机推荐

  1. 导入excel数据到数据库

    1.上传excel到服务器 jsp页面代码 <form action="actionname" method="post" id="form1& ...

  2. iOS开发UI篇—CAlayer层的属性

    iOS开发UI篇—CAlayer层的属性 一.position和anchorPoint 1.简单介绍 CALayer有2个非常重要的属性:position和anchorPoint @property ...

  3. LINK1123:failure during conversion to COFF:file invalid or corrupt

    参考 http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=20726500&id=4528320 试了微软官方说明:http ...

  4. Multiple dex files define Lcom/google/zxing/BarcodeFormat

    解决zxing “Could not find class 'com.goole.zxing.Result”和“Multiple dex files define”问题 时间 2014-04-24 1 ...

  5. springBoot专题3---->springBoot与多数据源的配置

    最近有点忙,更新有点慢.今天进来说说一说springBoot中如何配置多数据源. 第一,新建一个名为springBoot-mutidata的maven项目,完整的pom.xml配置如下: <?x ...

  6. 【Java EE 学习 43】【SVN版本控制工具】【CVS版本控制工具】

    一.SVN SVN服务器下载地址:https://subversion.apache.org/ 1.什么是版本控制:版本控制是维护工程蓝图的标准做法,能追踪工程蓝图从诞生一直到定案的过程.是一种记录若 ...

  7. 【Cocos2d-x游戏开发】Cocos2d-x中的数据存储技术

    一.引言 数据存储和网络功能可以说是一款游戏中必不可少的功能,如果一款游戏不能保存进度那么它的可玩性必然大打折扣(试想一下,玩家辛辛苦苦玩了一整天的游戏,结果退出时告诉人家不能保存关卡信息,你明天还得 ...

  8. SQLite 粗劣内容

    SQLite 的官网 http://addons.mozillan.org/firefox/addon/sqlite-manager/ http://www.sqlite.org sqlite3 *s ...

  9. PHP-Redis扩展使用手册(二)

    /* 根据多个key获取多个value,不存在的key返回false getMultiple是别名? * @param array 包含key的数组 * @return array 返回key对应va ...

  10. Qt Visual Studio Add-in 导出的 .pri 怎么用?

    今天咱们介绍一下 Qt Add-in 导出的 pri 文件怎么用.   一般需要导出这个文件, 主要应该是跨平台编译的需求, 所以这个文件里包含的东西会比较少, 咱们看下导出的文件是什么样子的: # ...