Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >一文以蔽之——Golang调用C++语言程序详解

一文以蔽之——Golang调用C++语言程序详解

原创
作者头像
liuzhen007
发布于 2025-01-30 03:38:50
发布于 2025-01-30 03:38:50
29100
代码可运行
举报
文章被收录于专栏:流媒体音视频流媒体音视频
运行总次数:0
代码可运行

前言

大家都知道Golang可以调用C语言,也可以调用C++语言,网上很多文章都是混在一起介绍的,其实二者有很大的区别。今天们先来了解Golang调用C++语言的方法和技巧。

1、代码结构

新建一个代码工程,创建如下代码文件。

代码语言:txt
AI代码解释
复制
-project
--add.h
--add.cpp
--main.go
--mod.go
--libadd.so

2、源文件

  • add.h

首先,定义C语言程序的头文件 add.h。

代码语言:c
代码运行次数:0
运行
AI代码解释
复制
// add.h
#ifndef ADD_H
#define ADD_H

void SayHello();

#endif
  • add.cpp

然后,定义C语言程序的源文件 add.cpp。

代码语言:c
代码运行次数:0
运行
AI代码解释
复制
// add.cpp
#include <iostream>
extern "C" {
    void SayHello() {
        std::cout << "Hello from C++!" << std::endl;
    }
}
  • main.go

最后,我们定义 Golang 语言的入口文件 main.go。‌熟悉的小伙伴都知道,main.go文件在 Golang 工程中扮演着重要角色。在 Golang 工程中,一个可执行程序必须包含一个名为 main 的包和一个名为 main 的函数。main.go 文件也是程序的入口文件。

代码语言:go
AI代码解释
复制
package main

/*
#cgo CXXFLAGS: -I.
#cgo LDFLAGS: -L. -ladd
#include "add.h"
*/
import "C"
import "fmt"

func main() {
    fmt.Println("start...")
    C.SayHello() // 调用 C++ 函数
    fmt.Println("end...")
}
  • go.mod

go.mod 文件在 Golang 工程中也扮演着重要角色,它是 Golang 工程中的模块管理文件,用于定义和管理 Golang 项目的模块依赖。它是也 Go Modules 系统的核心部分,文件记录了项目所依赖的所有模块及其版本信息。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
module add

go 1.23.4

3、编译命令

工程初始化:

代码语言:txt
AI代码解释
复制
go mod init add
go mod tidy

和C语言不一样,编译动态库的命令如下:

代码语言:txt
AI代码解释
复制
g++ -shared -o libadd.so -fPIC add.cpp

编译可执行程序:

代码语言:txt
AI代码解释
复制
go build

和C语言不一样,也可以直接执行go run main.go运行。

输出结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
start...
Hello from C++!
end...

4、相同点

* 使用 cgo

无论是调用 C 还是 C++,Golang 都通过 cgo 实现跨语言调用。cgo 是 Golang 提供的一种专属机制,允许 Golang 代码直接调用 C 或 C++ 代码。

* 引入头文件

在 Go 文件中,通过注释块引入 C 或 C++ 的头文件。例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/*
#include <stdio.h>  // C 头文件
#include "header.h"  // C++ 头文件
*/
import "C"

* 调用方式

在 Go 中调用 C 或 C++ 函数时,都需要使用 C. 前缀。例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
result := C.my_function()  // 调用 C 或 C++ 函数

* 类型转换

Go 和 C/C++ 之间的数据类型需要手动转换。例如:

  • Go 的 string 数据类型需要转换为 C 的 *C.char。

总结

总的来说,虽然调用 C 和 C++ 程序在 Go 中有很多相似之处,但由于 C++ 的复杂性和特性,调用 C++ 程序可能需要更多的注意和处理。至此,通过两篇文章我们分别介绍了Golang调用C语言和C++语言程序的使用方法。希望可以帮到有需要的小伙伴。最后补充一句:新年快乐,蛇年大吉!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
编辑精选文章
换一批
一文以蔽之——Golang调用C语言程序详解
大家都知道Golang可以调用C语言,也可以调用C++语言,网上很多文章都是混在一起介绍的,其实二者有很大的区别。今天们先来了解Golang调用C语言的方法和技巧。
liuzhen007
2025/01/25
1910
C++程序编译之谜(二)——隐藏源码,动态和静态链接库的秘密
前面我们提到了如果我们不希望把我们的源码提供出来,但是又想提供这个接口给调用者调用,那么这个该怎么做呢?
一点sir
2024/01/10
3370
Java 调用 Go 解决方案
Go,常被称为GoLang,是由 Google 精心打造的一种静态类型、编译型编程语言。它以其简洁的语法、卓越的并发处理能力和高效的性能而著称,因此在后端系统、云原生应用以及微服务架构中得到了广泛应用。Go语言凭借其丰富的标准库,以及 goroutines 和 channels 等独特特性,在开发可扩展且高效的程序方面展现了显著优势。许多开发者倾向于将Go与其他编程语言,如Java,结合使用,以构建功能更为强大的多语言系统。在本文中,我们将深入探讨如何从Java环境中调用GoLang函数,以实现两种语言的无缝集成。
FunTester
2025/01/23
2210
Java 调用 Go 解决方案
C语言竟可以调用Go语言函数,这是如何实现的?
今天和大家聊一个问题,一门语言是否可以在同一个进程内调用另外一门语言实现的函数?例如 C 语言是否可以调用 Golang 实现的函数?注意我说的是同进程内调用,跨进程的 IPC、PRC 之类的技术不算。
开发内功修炼
2024/05/27
7210
C语言竟可以调用Go语言函数,这是如何实现的?
全面总结: Golang 调用 C/C++,例子式教程
作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblogs.com/linguanh/ GitHub : https://github.com/af913337456/ 大部分人学习或者使用某样东西,喜欢在直观上看到动手后的结果,才会有继续下去的兴趣。 前言: Golang 调用 C/C++ 的教程网上很多,就我目前所看到的,个人见解就是比较乱,坑也很多。希望本文能在
林冠宏-指尖下的幽灵
2018/02/11
5.4K0
【C#学习笔记01】从程序框架到函数调用
​​C语言作为一种高效、灵活的编程语言,在嵌入式系统、操作系统开发以及高性能计算中扮演着重要角色。无论是初学者还是有经验的开发者,掌握C语言的基础知识都是理解计算机底层原理和编写高质量代码的关键。
一条晒干的咸鱼
2025/03/11
2860
【C#学习笔记01】从程序框架到函数调用
Go如何调用C
Go 语言通过 cgo 提供了与 C 代码交互的能力,使得开发者能够在 Go 程序中直接调用 C 语言的函数和库。无论是嵌入 C 代码,还是链接 C 动态库,cgo 都能让 Go 程序与 C 语言代码紧密结合,发挥 C 的高性能和 Go 的便利性。
孟斯特
2024/12/02
2220
Go如何调用C
C++程序编译之谜(一)——多文件编译的奇怪现象
在C++多文件编译的时候,很多人都会经常碰见这样的一种情况,在一个cpp文件中调用另一个cpp文件的函数,那么可以直接调用吗?我们来做个试验。
一点sir
2024/01/10
3980
golang 学习(10): 使用go语言调用c语言的so动态库
最近在学习go,因为需要调用c语言打包成的so动态库里面的方法,避免自己再去造轮子,所以想直接使用golang调用so,但是参考了其他博客大佬写的,我每一步原封不动的写下来,结果都是一堆错误,错误因为没有实时的截图,所以我这里不会展示出具体出现了哪些错误,我将记录下我成功调用的所有步骤。
Mokwing
2020/09/08
4.7K0
简单的Python调用C++程序
最近写BUG的时候遇到python计算很慢的情况,于是调研了一波在python中嵌入C++程序的方法,记录一下,便于查询。
润森
2022/09/22
8430
用Python使用C语言程序(Windows平台)
前言 在机器学习中,很多时候我们需要Python和C的混合编程,最重要的原因是为了性能效率的提升: 解释型语言一般比编译型语言慢,一般提高性能的有效做法是,先做性能测试,找出性能瓶颈部分,然后把瓶颈部分在扩展中实现。 本文的目标是在windows平台下(使用pycharm),实现python调用C语言编写的程序。主要参考资料: python扩展实现方法--python与c混和编程(http://www.cnblogs.com/btchenguang/archive/2012/09/04/2670849.ht
用户1332428
2018/03/08
2.9K0
用Python使用C语言程序(Windows平台)
为什么C语言会有头文件
前段时间一个刚转到C语言的同事问我,为什么C会多一个头文件,而不是像Java和Python那样所有的代码都在源文件中。我当时回答的是C是静态语言很多东西都是需要事先定义的,所以按照惯例我们是将所有的定义都放在头文件中的。事后我再仔细想想,这个答案并不不能很好的说明这个问题。所以我在这将关于这个问题的相关内容写下来,希望给大家一点提示,也算是一个总结
Masimaro
2018/08/31
2.3K0
为什么C语言会有头文件
【可测试性实践】C++ 单元测试&代码覆盖率统计
最近在调研C++工程怎么做单元测试和代码覆盖率统计,由于我们工程有使用Boost库,尝试使用Boost.Test来实现单元测试并通过Gcov和Lcov来生成代码覆盖率报告。本文记录完整的搭建测试Demo,希望能带来一定参考。
巫山老妖
2024/09/12
4600
【可测试性实践】C++ 单元测试&代码覆盖率统计
简单的Python调用C++程序
最近写BUG的时候遇到python计算很慢的情况,于是调研了一波在python中嵌入C++程序的方法,记录一下,便于查询。
小白学视觉
2025/02/25
3250
简单的Python调用C++程序
Go与C的桥梁:CGO入门剖析与实践
作者:panhuili,腾讯 IEG 后台开发工程师 Go 作为当下最火的开发语言之一,它的优势不必多说。Go 对于高并发的支持,使得它可以很方便的作为独立模块嵌入业务系统。有鉴于我司大量的 C/C++存量代码,如何 将 Go 和 C/C++进行打通就尤为重要。Golang 自带的 CGO 可以支持与 C 语言接口的互通。本文首先介绍了 cgo 的常见用法,然后根据底层代码分析其实现机制,最后在特定场景下进行 cgo 实践。 一、CGO 快速入门 1.1、启用 CGO 特性 在 golang 代码中加
腾讯技术工程官方号
2021/02/07
6.9K0
CGO学习一,初步认知和基本数据类型转换
CGO 是 GO 语言里面的一个特性,CGO 属于 GOLANG 的高级用法,主要是通过使用 GOLANG 调用 CLANG 实现的程序库
阿兵云原生
2023/02/16
9100
【OpenIM原创】C/C++调用golang函数,golang回调C/C++函数
Open-IM 是由前微信技术专家打造的全开源、永久免费、无限制的即时通讯组件。Open-IM 包括 IM 服务端和客户端 SDK,实现了高性能、轻量级、易扩展等重要特性。开发者通过集成 Open-IM 组件,并私有化部署服务端,可以将即时通讯、实时网络能力免费、快速集成到自身应用中,并确保业务数据的安全性和私密性。
用户8964349
2021/09/09
1.9K0
golang源码分析(36)cgo
GO调C基本原理CGO是实现Go与C互操作的方式,包括Go调C和C调Go两个过程。其中Go调C的过程比较简单。对于一个在C中定义的函数add3,在Go中调用时需要显式的使用C.add3调用。其中C是在程序中引入的一个伪包
golangLeetcode
2022/08/02
1.5K0
江哥带你玩转C语言 02- 创建第一个C语言程序
Hello world 这个世界上, 几乎所有程序员入门的第一段代码都是Hello World. 原因是当年C语言的作者Dennis Ritchie(丹尼斯 里奇)在他的名著<The C Programming Language>中第一次引入, 传为后世经典, 其它语言亦争相效仿, 以示敬意 [8e87f83d4d2501a1c1248c61a786ccc5.png] 如何创建C语言文件 [7ad55f94d20cdd623cf7b15c5d897971.png] [ad8b418e47011d7013e9
极客江南
2021/06/24
7460
c++ hello world程序的解释
代码 //# 预处理指令,在预编译时处理 //#include <stdio.h> 包含stdio.h文件 stdio.h类似于菜单 // 两个斜杠是注释 //符号与()结和 代表这个是一个函数 //main() main函数也叫主函数 整个程序中仅且只有一个main函数,程序从main函数 //开始执行 //int 代表main函数结束之后的返回值类型 //return 结束这个函数,然后返回值,返回值的类型和函数定义时返回值类型一致 //{}里面的是函数体,所有需要执行的代码必须写在{}中 //每
Zkeq
2022/05/18
5020
c++ hello world程序的解释
相关推荐
一文以蔽之——Golang调用C语言程序详解
更多 >
LV.3
架构师流媒体音视频研发
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验