Go调用C/C++的小demo

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

近期在做项目中有一项业务场景是通过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
  • 如果动态库不存在,将会报找不到定义之类的错误信息
目录
相关文章
|
3月前
|
Go C++
【力扣】2696. 删除子串后的字符串最小长度(模拟 栈 C++ Go实现栈)
【2月更文挑战第18天】2696. 删除子串后的字符串最小长度(模拟 栈 C++ Go实现栈)
50 6
|
3月前
|
并行计算 Go C++
2182.构造限制重复的字符串(模拟 贪心 优先队列 C++ Go)
【2月更文挑战第19天】2182.构造限制重复的字符串(模拟 贪心 优先队列 C++ Go)
34 1
|
26天前
|
前端开发 编译器 程序员
协程问题之为什么 C++20 的协程代码比其他语言的协程 demo 长很多如何解决
协程问题之为什么 C++20 的协程代码比其他语言的协程 demo 长很多如何解决
|
2月前
|
Java Go C#
编程语言C#、C++、Java、Python、go 选择哪个好?
我想说的是,不论选择哪种编程语言,决定选择的都是你最终的目的,做选择之前,先充分调研每一个选择项,再做选择思路就会非常清晰了。
63 3
|
2月前
|
存储 前端开发 中间件
Go Web 开发 Demo【用户登录、注册、验证】(3)
Go Web 开发 Demo【用户登录、注册、验证】
|
2月前
|
前端开发 数据库连接 Go
Go Web 开发 Demo【用户登录、注册、验证】(1)
Go Web 开发 Demo【用户登录、注册、验证】
|
2月前
|
JSON 前端开发 Java
Go Web 开发 Demo【用户登录、注册、验证】(4)
Go Web 开发 Demo【用户登录、注册、验证】
|
2月前
|
Go 数据库
Go Web 开发 Demo【用户登录、注册、验证】(2)
Go Web 开发 Demo【用户登录、注册、验证】
|
3月前
|
前端开发 JavaScript Go
Go 实战|使用 Wails 构建轻量级的桌面应用:仿微信登录界面 Demo
Wails 框架提供了一种简洁而强大的方式,让开发者能够利用 Go 的性能优势和 Web 前端的灵活性,从而能够使用更高效、更轻量级的方法来构建跨平台的桌面应用。本文探讨 Wails 框架的使用,从搭建环境到开发,再到最终的构建打包。
151 1
Go 实战|使用 Wails 构建轻量级的桌面应用:仿微信登录界面 Demo
|
3月前
|
编解码 JavaScript 前端开发
【专栏】介绍了字符串Base64编解码的基本原理和在Java、Python、C++、JavaScript及Go等编程语言中的实现示例
【4月更文挑战第29天】本文介绍了字符串Base64编解码的基本原理和在Java、Python、C++、JavaScript及Go等编程语言中的实现示例。Base64编码将24位二进制数据转换为32位可打印字符,用“=”作填充。文中展示了各语言的编码解码代码,帮助开发者理解并应用于实际项目。
76 1