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 .
b -lhello -Wl,-rpath,/usr/local
b 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的驱动程序.本来就是半桶水的我,还在为等待打开一个页面而磨平了耐心.本想依 ...
随机推荐
- 源码编译安装mysql
1 概述 首先来看下mysql的下载地址: http://ftp.plusline.de/mysql/Downloads/ 这里有mysql的各种版本 操作系统:CentOS releas ...
- SVM实现邮件分类
首先学习一下svm分类的使用. 主要有以下步骤: Loading and Visualizing Dataj Training Linear SVM Implementing Gaussian Ker ...
- Android:联系人Contacts之ContentResolver query 参数详解
注:本片整理自 http://blog.csdn.net/wssiqi/article/details/8132603 1.获取联系人姓名 一个简单的例子,这个函数获取设备上所有的联系人ID和联系人N ...
- Android root + 修改host
1.使用KingRoot下载手机版,安装后进行Root处理. 2.下载 RE文件管理器,安装后,打开应用,进入etc,找到host, 勾选,菜单中选择 以文本方式编辑,修改好之后,按返回键 ,提示保存 ...
- CSC321 神经网络语言模型 RNN-LSTM
主要两个方面 Probabilistic modeling 概率建模,神经网络模型尝试去预测一个概率分布 Cross-entropy作为误差函数使得我们可以对于观测到的数据 给予较高的概率值 同时可以 ...
- MongoDB在Windows下安装、Shell客户端的使用、Bson扩充的数据类型、MongoVUE可视化工具安装和简单使用、Robomongo可视化工具(2)
一.Windows 下载安装 1.去http://www.mongodb.org/downloads下载,mongodb默认安装在C:\Program Files\MongoDB目录下,到F:\Off ...
- Power BI for Office 365(五)Power View第二部分
继续上一篇Power View 报表的创建, Anna觉得为每一个大类创建一张单独的报表似乎很不现实,所以她决定按照另外一种方式来设计报表,从而满足最终用户想要查看不同大类下的数据的要求. 于是Ann ...
- 《DSP using MATLAB》示例Example5.15
代码: x1 = [1,2,2]; x2 = [1,2,3,4]; y1 = circonvt(x1,x2,5); % N = 5 n1 = 0:1:length(x1)-1; n2 = 0:1:le ...
- 13.final关键字
1.final修饰的变量只能赋一次值,不赋值时,会提示初始化 2.final修饰的方法不能被重写 3.final修饰的类不能被继承
- 那些年一起用过的iOS开发利器之CocoaPods
本系列所有工具的简介见:http://www.cnblogs.com/lloydsheng/p/3637606.html CocoaPods是一个负责管理iOS项目中第三方开源代码的工具.CocoaP ...