GO程序调用C及C++库的实现方式
2017-05-09 16:24
447 查看
一.windows下go调用c函数的实现方法
1)直接在go文件中使用
执行结果:
2)使用C函数
3)使用动态库方法
a)go工程目录结构
b)go调用C&C++动态库
.h
.cpp
c)main.go代码
.
PS:方法二需要将动态库和go程序放在同一目录下
4.环境搭建
需要安装如下程序
mingw-w64-install.exe
注意事项:安装此程序安装过程中要选择64位版本的,安装完后要将mingw的bin目录添加到path环境变量中
其实这里的32位版本或者64位版本的要求就是要求和go下使用的gcc版本(即32位或64位一致)
使用vs生成动态库,注意此动态库版本一定要和go编译环境下的gcc的环境版本要一样(win32&win64的区别)
总结:
1.import “C” 一定要紧跟注释后的语句
2.此语句不能和其他包一起导入
3.程序目录下包含库
1)直接在go文件中使用
package main /* int add(int a,int b){ return a+b; } */ import "C" import ( "fmt" ) func main() { fmt.Println("Hello World!") fmt.Println(C.add(2, 1)) }
执行结果:
Hello World! 3
2)使用C函数
// main.go package main /* #include <stdlib.h> */ import "C" import ( "fmt" ) func main() { fmt.Println("Hello World!") fmt.Println(C.rand()) }
3)使用动态库方法
a)go工程目录结构
|-project | |-lib | | |-Algorithm.dll | |-include | | |-Algorithm.h | |-src | | |-main.go | |-pkg | |-bin
b)go调用C&C++动态库
.h
//Algorithm.h #ifndef ALGORITHM_DLL_H #define ALGORITHM_DLL_H namespace Algorithm { extern "C" __declspec(dllexport) int add(int a, int b); extern "C" __declspec(dllexport) int sub(int a, int b); } #endif // !ALGORITHM_DLL_H
.cpp
#include "Algorithm.h" int Algorithm::add(int a, int b) { return a + b; } int Algorithm::sub(int a, int b) { return a - b; }
c)main.go代码
//方法一 // main.go package main import ( "fmt" ) import ( "syscall" ) func callDll() { dll32 := syscall.NewLazyDLL("lib/Algorithm.dll") fmt.Println("call dll:", dll32.Name) g := dll32.NewProc("add") ret, _, _ := g.Call(uintptr(4), uintptr(5)) fmt.Println("result is :", ret) } func main() { fmt.Println("Hello World!") callDll() //fmt.Println(C.add(2, 1)) }
.
//方法二 // main.go package main /* #cgo CFLAGS: -Iinclude #cgo LDFLAGS: -Llib -lAlgorithm #include "Algorithm.h" */ import "C" import ( "fmt" ) func main() { fmt.Println("Hello World!") ret := int32(C.add(2, 3)) if ret != 0 { fmt.Println("1111") } else { fmt.Println("2222") } }
PS:方法二需要将动态库和go程序放在同一目录下
4.环境搭建
需要安装如下程序
mingw-w64-install.exe
注意事项:安装此程序安装过程中要选择64位版本的,安装完后要将mingw的bin目录添加到path环境变量中
其实这里的32位版本或者64位版本的要求就是要求和go下使用的gcc版本(即32位或64位一致)
使用vs生成动态库,注意此动态库版本一定要和go编译环境下的gcc的环境版本要一样(win32&win64的区别)
总结:
1.import “C” 一定要紧跟注释后的语句
2.此语句不能和其他包一起导入
3.程序目录下包含库
相关文章推荐
- c++ 非托管程序调用c#托管程序l的实现操作方式
- java程序调用C、C++动态库的几种实现方式,即JNI的应用方式
- C++调用Fortran程序----动态链接方式
- 转 C++调用HTTP实现方式
- init.rc文件里面启动c++程序,通过jni调用java实现
- 【Java】Java调用C/C++程序的实现(jni)
- C++调用HTTP实现方式
- Android实现对c++方式调用
- php调用c++程序实现web访问c++程序
- C++实现在桌面创建程序的快捷方式
- C++实现在桌面创建程序的快捷方式
- 今天工作需要调用一个c++程序,以给那个程序发送请求的方式,遇到了跨域问题
- linux下使用jni实现c++调用java程序(3)多线程jni使用
- COM方式实现C++调用C#代码的一些总结
- 两个c++编译器对c++对象模型和虚函数调用方式的实现
- linux下使用jni实现c++调用java程序(5)参考资料总结
- C++调用C#的DLL程序实现方法
- 【转载】C++实现在桌面创建程序的快捷方式
- C++实现一个多线程同步方式的协同工作程序示例
- 用Swig将c/c++程序转为java代码(使用swig实现java调用c、c++的方法)