cgo调用C++函数实现
2017-08-22 16:50
323 查看
转载地址:http://www.cnblogs.com/sohoer2003/p/4329085.html
大概的流程为:
1)将C++中的某个函数转换成C的形式,变成端口的形式暴露出去
2)将声明放在.h文件中,将函数体封装在动态库或者静态库中,供go调用
3)在go中通过cgo LDFLAGS指明Lib所在的地址,通过cgo CFLAGS指令include所在的地址,即可调用
在这里我走了一些弯路,供参考:
1)忽略#cgo LDFLAGS #cgo CFLAGS以为是被注释的部门,其实很重要
2)c.h文件中忽视#ifdef __cplusplus该指令指明内部使用c++的方式进行编译
3)忽略test.go文件中编译制导指令 -lstdc++ 很关键
1)swift,貌似官网的推荐
2)extern "C"
我使用后者,用起来比较爽,上代码
c.h
c.c
cplus.hpp
cplus.cpp
build.sh
test.go
执行顺序
大概的流程为:
1)将C++中的某个函数转换成C的形式,变成端口的形式暴露出去
2)将声明放在.h文件中,将函数体封装在动态库或者静态库中,供go调用
3)在go中通过cgo LDFLAGS指明Lib所在的地址,通过cgo CFLAGS指令include所在的地址,即可调用
在这里我走了一些弯路,供参考:
1)忽略#cgo LDFLAGS #cgo CFLAGS以为是被注释的部门,其实很重要
2)c.h文件中忽视#ifdef __cplusplus该指令指明内部使用c++的方式进行编译
3)忽略test.go文件中编译制导指令 -lstdc++ 很关键
1)swift,貌似官网的推荐
2)extern "C"
我使用后者,用起来比较爽,上代码
c.h
1 #pragma once 2 3 #ifdef __cplusplus 4 extern "C" { 5 #endif 6 void test(); 7 #ifdef __cplusplus 8 } 9 #endif
c.c
1 #include "cplus.hpp" 2 #include "c.h" 3 4 void test() { 5 A *a = new B(); 6 a->test(); 7 }
cplus.hpp
1 #pragma once 2 3 class A { 4 public: 5 virtual void test(); 6 }; 7 class B: public A { 8 public: 9 void test(); 10 };
cplus.cpp
#include <iostream> #include "cplus.hpp" using namespace std; void A::test() { cout << "a" << endl; } void B::test() { cout << "b" << endl; }
build.sh
1 g++ -o cplus.o -c cplus.cpp 2 g++ -o c.o -c c.c 3 ar r libc_test.so c.o cplus.o
test.go
1 package main 2 // #cgo LDFLAGS: -L . -lc_test -lstdc++ 3 // #cgo CFLAGS: -I ./ 4 // #include "c.h" 5 import "C" 6 7 func main(){ 8 9 C.test() 10 11 }
执行顺序
1 ./build.sh 2 go build test.go
相关文章推荐
- C++中调用库函数实现快速排序
- [linux,c++]使用指针函数实现多个函数调用_Advanced
- Linux下c++调用自己编写的matlab函数:通过mcc动态链接库.so实现
- 实现 C调用 C++ 函数
- java JNI 实例 实现调用c++函数
- C或C++调用Windows系统函数 实现延时 或 获取当前时间的处理
- (转)如何在linux C/C++语言中调用 sqlite 的函数接口来实现对数据库的管理
- C++利用函数调用实现数组数据的输入输出
- 如何在linux C/C++语言中调用 sqlite 的函数接口来实现对数据库的管理(转)
- 如何在QT中实现C语言中调用C++的函数
- CDHtmlDialog的基本使用(C++调用JS函数的实现)
- 不调用库函数,实现字符串复制函数char * strcpy(char * dst, const char * src) C/C++软件开发求职面试题 必备考点(二)
- Linux下c++调用自己编写的matlab函数:通过shell script system command实现
- Linux下c++调用自己编写的matlab函数:通过matlab引擎实现
- C++函数重载实现的原理以及为什么在C++中调用C语言编译的函数时要加上extern "C"声明
- 小字典之MFC简单的多线程调用类的成员函数实现逐步画线功能 VS2015 C++ 完成
- 函数编译lua笔记 --- 一个C++调用lua函数的类的实现
- extern C实现C与C++函数的相互调用
- CDHtmlDialog的基本使用(C++调用JS函数的实现)
- extern C(C++与C实现相互函数的调用)