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
  • 如果动态库不存在,将会报找不到定义之类的错误信息
目录
相关文章
|
6天前
|
并行计算 Go C++
2182.构造限制重复的字符串(模拟 贪心 优先队列 C++ Go)
【2月更文挑战第19天】2182.构造限制重复的字符串(模拟 贪心 优先队列 C++ Go)
25 1
|
6天前
|
Go C++
【力扣】2696. 删除子串后的字符串最小长度(模拟 栈 C++ Go实现栈)
【2月更文挑战第18天】2696. 删除子串后的字符串最小长度(模拟 栈 C++ Go实现栈)
36 6
|
6月前
|
C++ 存储 Cloud Native
c++ libevent demo
c++ libevent demo
|
6天前
|
编解码 JavaScript 前端开发
【专栏】介绍了字符串Base64编解码的基本原理和在Java、Python、C++、JavaScript及Go等编程语言中的实现示例
【4月更文挑战第29天】本文介绍了字符串Base64编解码的基本原理和在Java、Python、C++、JavaScript及Go等编程语言中的实现示例。Base64编码将24位二进制数据转换为32位可打印字符,用“=”作填充。文中展示了各语言的编码解码代码,帮助开发者理解并应用于实际项目。
|
6天前
|
前端开发 JavaScript Go
Go 实战|使用 Wails 构建轻量级的桌面应用:仿微信登录界面 Demo
Wails 框架提供了一种简洁而强大的方式,让开发者能够利用 Go 的性能优势和 Web 前端的灵活性,从而能够使用更高效、更轻量级的方法来构建跨平台的桌面应用。本文探讨 Wails 框架的使用,从搭建环境到开发,再到最终的构建打包。
49 1
Go 实战|使用 Wails 构建轻量级的桌面应用:仿微信登录界面 Demo
|
6天前
|
Go C++
【力扣】2645. 构造有效字符串的最小插入数(动态规划 贪心 滚动数组优化 C++ Go)
【2月更文挑战第17天】2645. 构造有效字符串的最小插入数(动态规划 贪心 滚动数组优化 C++ Go)
32 8
|
6天前
|
安全 Java Go
Go 调用 C/C++ 函数全攻略
Go 调用 C/C++ 函数全攻略
181 0
|
9月前
|
Rust 自然语言处理 Java
单链表的多语言表达:C++、Java、Python、Go、Rust
单链表是一种链式数据结构,由一个头节点和一些指向下一个节点的指针组成。每个节点包含一个数据元素和指向下一个节点的指针。头节点没有数据,只用于表示链表的开始位置。单链表相对于数组的优点是插入和删除元素时不需要移动其他元素,时间复杂度为O(1)。但是,在查找元素时,单链表比数组要慢,时间复杂度为O(n)。
16641 7
|
6天前
|
Cloud Native Linux Go
Go 编程语言详解:用途、特性、与 Python 和 C++ 的比较
Go是一个跨平台、开源的编程语言 Go可用于创建高性能应用程序 Go是一种快速、静态类型、编译型语言,感觉上像动态类型、解释型语言 Go由Robert Griesemer、Rob Pike和Ken Thompson于2007年在Google开发 Go的语法类似于C ++
77 0
|
11月前
|
JavaScript 前端开发 C++
JavaScript 调用 C++/Qt 工程(附有代码 + demo)
JavaScript 调用 C++/Qt 工程(附有代码 + demo)