golang调用c++文件
简要步骤:
1,将c++ 的方法提取到头文件.h中( )
2,编译cc(c++)文件为动态链接库so文件 gcc -fPIC -shared hello.c -o libhello.so
3,将头文件放入include目录 .so放入lib目录
4,go程序中指定 CFLAGS 和 LDFLAGS
#cgo LDFLAGS: -L .
A[Y)I~](ZC9Z[3Y)IDK7LK.gif)
A[Y)I~](ZC9Z[3Y)IDK7LK.gif)
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
编译如果出错:
运行: ./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++的方法
http://doumadou.github.io/golangdiao-yong-ccfang-fa.html (需要步骤五才能运行成功)
附件:下载
golang调用c++文件的更多相关文章
- golang调用c++的dll库文件
最近使用golang调用c++的dll库文件,简单了解了一下,特作此笔记:一.DLL 的编制与具体的编程语言及编译器无关 dll分com的dll和动态dll,Com组件dll:不管是何种语言写的都可以 ...
- Golang调用windows下的dll动态库中的函数 Golang 编译成 DLL 文件
Golang调用windows下的dll动态库中的函数 package main import ( "fmt" "syscall" "time&quo ...
- 全面总结: Golang 调用 C/C++,例子式教程
作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblogs.com/linguan ...
- golang生成c-shared so供c语言或者golang调用到例子
1.golang生成c-shared类型到so 建立文件夹hello,创建main.go文件,内容如下 package main import "C" func main() {} ...
- LevelDB性能测试|Golang调用LevelDB
LevelDB性能测试|Golang调用LevelDB 不同方式使用压力测试 用ssdb,TCP连接方式调用,底层存储levelDB 直接调用Cgo的levelDB (必须保证串行) 直接调用Gola ...
- Golang 调用 C/C++,例子式教程
大部分人学习或者使用某样东西,喜欢在直观上看到动手后的结果,才会有继续下去的兴趣. 前言: Golang 调用 C/C++ 的教程网上很多,就我目前所看到的,个人见解就是比较乱,坑也很多.希望本文能在 ...
- golang调用c动态库
golang调用c动态库 简介 golang调用c语言动态库,动态方式调用,可指定动态库路径,无需系统目录下 核心技术点 封装c动态库 go语言调用c代码 实例代码 封装c动态库 头文件 test_s ...
- Golang 调用 aws-sdk 操作 S3对象存储
Golang 调用 aws-sdk 操作 S3对象存储 前言 因为业务问题,要写一个S3对象存储管理代码,由于一直写Go,所以这次采用了Go,Go嘛,快,自带多线程,这种好处就不用多说了吧. 基础的功 ...
- Golang调用Dll案例
Golang调用Dll案例 前言 在家办公已经两个多星期了,目前最大的困难就是网络很差.独自一个人用golang开发调用dll的驱动程序.本来就是半桶水的我,还在为等待打开一个页面而磨平了耐心.本想依 ...
随机推荐
- 解决linux系统启动之:unexpected inconsistency:RUN fsck
现象: 虚拟机在启动过程中提示: unexpected inconsistency;RUN fsck MANUALLY 原因分析: 1.由于意外关机导致的文件系统问题 解决方法: 方法1: 输入ROO ...
- 动态选路、RIP协议&&OSPF协议详解
动态选路.RIP协议&&OSPF协议详解 概念 当相邻路由器之间进行通信,以告知对方每个路由器当前所连接的网络,这时就出现了动态选路.路由器之间必须采用选路协议进行通信,这样的选路协议 ...
- 【转】Caffe初试(六)激活层及参数
在激活层中,对输入数据进行激活操作(实际上就是一种函数变换),是逐元素进行运算的.从bottom得到一个blob数据输入,运算后,从top输入一个blob数据.在运算过程中,没有改变数据的大小,即输入 ...
- iOS之initialize与load
initialize和load 这两个方法都是是什么时候调用的呢?都有着什么样的作用,下面看看吧! initialize +(void)initialize{ } 什么时候调用:当第一次使用这个类的时 ...
- 站点SEO优化日记之设置目标关键词
一.怎样确定关键词? 根据百度指数,选择搜索指数较高的作为候选关键词.一个关键词的搜索结果中,若大部分都为非首页链接,则该关键词可在短时间内通过优化获得好的排名,可选择此类关键词作为目标关键词. 二. ...
- 使用MultipartEntity进行post请求的默认MIME类型
MultipartEntity .FileBody的默认MIME类型:application/octet-stream
- Runnable接口
Runnable接口的说用是使线程不仅可以继承Thread类实现,还可以继承其他类(比如:JFrame). 此接口具有两个构造方法: (1)public Thread(Runnable r) (2)p ...
- EXPORT_SYMBOL的使用
转自:http://blog.csdn.net/cailiwei712/article/details/7998525 在查看内核驱动代码的时候会经常看到在一些函数后面总会跟EXPORT_SYMBOL ...
- OSS层基础:平台区分
#define PLATFORM_WINDOWS 1 #define PLATFORM_MAC 2 #define PLATFORM_UNIX 3 #if defined(_WIN32) #defin ...
- 解决Spring的Component-scan和packagesToScan不支持Eclipse RCP问题
http://www.360doc.com/content/13/0401/13/10825198_275274565.shtml