增量学习-Go篇|Go调用C/C++的小demo

639 阅读2分钟

这是我参与更文挑战的第1天,活动详情查看: 更文挑战

近期在做项目中有一项业务场景是通过ffmpeg编译生成视频文件,因项目是以Go语言开发的,所以在完成这个一个功能主要使用的方案是通过go调用c++生成视频。其中,c++主要工作是封装了使用ffmpeg进行编码和解码工作。

第一次接触生成视频的业务场景,对Go也刚步入学习阶段,所以自己尝试写个hello world的demo先了解这整个过程。

go 调用 c/c++ 函数的实现方式有:

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

第一种方式

package main

/*
#include <stdio.h>

void hi() {
    printf("hello world!\n");
}
*/
import "C"
import "fmt" //这里可看作封装的伪包C, 这条语句要紧挨着上面的注释块,不可在它俩之间间隔空行!

func main() {
   C.hi()
   fmt.Println("Hi, Jasen")
}

第二种方式:

直接引用 c/c++ 文件的形式。注意,go无法直接调用c++,都是通过调用C,再由C去调用C++

hello.c

#include "hello.h"
#include <stdio.h>


void sayHello() {
    printf("Welcome to the C World!\n");
}

hello.h

#ifndef HELLO_H
#define HELLO_H
void sayHello();
#endif

hello.go

package clib

/*
#include "hello.h"
*/
import "C"

func SayHelloV1(){
   C.sayHello()
}

第三种方式:

使用 gcc 或 g++ 生成 .so库,或 win 下生成 dll

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

在go文件中引用方式:

  • CFLAGS: -I路径 这句话指明头文件所在路径,-Iinclude 指明 当前项目根目录的 include 文件夹

  • LDFLAGS: -L路径 -l名字 指明动态库的所在路径,-Llib -llibvideo,指明在 lib 下面以及它的名字 video

  • 如果动态库不存在,将会报找不到定义之类的错误信息