Go   发布时间:2022-04-09  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了全面总结: Golang 调用 C/C++,例子式教程大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

Golang 调用 C/C++ 的教程网上很多,就我目前所看到的,个人见解就是比较乱,坑也很多。希望本文能在一定程度上,做到更通俗明了。

<h2 id="go-调用-cc-函数的实现方式有">go 调用 c/c++ 函数的实现方式有:

  • 直接嵌套在go文件中使用,最简单直观的
  • 导入动态库 .so 或 dll 的形式,最安全但是很不爽也比较慢的
  • 直接引用 c/c++ 文件的形式,层次分明,容易随时修改看结果的

第三个直接引用 c/c++ 文件的形式 是我要介绍的重点。

  • Linux 具备 gcc 与 g++ 即可
  • Windows 需要安装 ,否则编译时会有这类错:cAnnot find -lmingwex
  • @H_889_11@mac 参 Linux

文件">1,直接嵌套在go文件

@H_696_41@package main /* // C 标志io头文件,你也可以使用里面提供的函数 #include

void pri(){
printf("hey");
}

int add(int a,int b){
return a+b;
}
*/
import "C" // 切勿换行再写这个

import "fmt"

func main() {
fmt.Println(C.add(2,1))
}

上面的代码,直接拷贝运行就能输出结果:3

@H_262_65@
  • 但凡要引用与 c/c++ 相关的内容,写到 go 文件的头部注释里面
  • 嵌套的 c/c++ 代码必须符合其语法,不与 go 一样
  • import "C" 这句话要紧随,注释后,不要换行,否则报错
  • go 代码调用 c/c++ 的格式是: C.xxx()例如 C.add(2,1)

.so-或-.dll-的形式">2,导入动态库 .so 或 .dll 的形式

@H_696_41@|-project | |-lib | | |-libvideo.dll | | |-libvideo.so | |-include | | |-video.h | |-src | | |-main.go

文件-.h-如下面这样">头文件 .h 如下面这样

//video.h
#ifndef VIDEO_H
#define VIDEO_H
void exeFFmpegCmd(char* cmd); // 声明
#endif

文件-.c-如下面这样">源文件 .c 如下面这样

#include 
#include "video.h"

void exeFFmpegCmd(char* cmd){ // 实现
// ....
printf("finish");
}

<h4 id="使用-gcc-或-g-生成-.so库或-win-下生成-dll">使用 gcc 或 g++ 生成 .so库,或 win 下生成 dll

例如: gcc video.c -fPIC -shared -o libvideo.so

把动态库放到一个你喜欢的目录,也可以放到当前项目里面,像上面列出的例子一样。再引用


package main

/*

cgo CFLAGS: -Iinclude

cgo LDFLAGS: -Llib -llibvideo

include "video.h"

*/
import "C"

import "fmt"

func main() {
cmd := C.CString("ffmpeg -i ./xxx/*.png ./xxx/yyy.mp4")
C.exeFFmpegCmd(&cmd)
}

<h4 id="先回答为什么说这种是最安全的和最不爽的原因如下">先回答为什么说这种是最安全的和最不爽的?原因如下:

  • 动态库破解十分困难,如果你的 go 代码泄露,核心动态库没那么容易被攻破
  • 动态库会在被使用的时候被加载,影响速度
  • 操作难度比方式一麻烦不少

  • CFLAGS: -I路径 这句话指明头文件所在路径,-Iinclude 指明 当前项目根目录的 include 文件
  • LDFLAGS: -L路径 -l名字 指明动态库的所在路径,-Llib -llibvideo,指明在 lib 下面以及它的名字 video
  • 如果动态库不存在,将会爆找不到定义之类错误信息

文件的形式-重点">3,直接引用 c/c++ 文件的形式 (重点)

@H_696_41@|-util | |-util.h | |-util.c | |-util.go

int sum(int a,int b);

#include "util.h"
int sum(int a,int b){
    return (a+b);
}

@H_696_41@package util

/*

include "util.c"

*/
import "C"

import "fmt"

func GoSum(a,b @R_489_10185@ int {
s := C.sum(c.int(a),C.int(b))
fmt.Println(s)
}

<h4 id="这样调用-main.go">这样调用 main.go
<pre class="golang">package main

func main(){
util.GoSum(4,5)
}

第三种方式便是如此简洁明了

最后,补充一下,一般需要 go 调用 c/c++ 的,主要是使用一些著名的开源库,例如 ffmpegopencv,等这些源码是基于 c/c++ 语言的,除此之外还有一个很重要的点,便是运行速度!

大佬总结

以上是大佬教程为你收集整理的全面总结: Golang 调用 C/C++,例子式教程全部内容,希望文章能够帮你解决全面总结: Golang 调用 C/C++,例子式教程所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: