前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >一文以蔽之——Golang调用C++语言程序详解

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

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

前言

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

1、代码结构

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

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

2、源文件

  • add.h

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

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

void SayHello();

#endif
  • add.cpp

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

代码语言:c
代码运行次数:0
复制
// 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
复制
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
复制
module add

go 1.23.4

3、编译命令

工程初始化:

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

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

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

编译可执行程序:

代码语言:txt
复制
go build

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

输出结果:

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

4、相同点

* 使用 cgo

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

* 引入头文件

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

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

* 调用方式

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

代码语言:javascript
代码运行次数:0
复制
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 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 1、代码结构
  • 2、源文件
  • 3、编译命令
  • 4、相同点
    • * 使用 cgo
    • * 引入头文件
    • * 调用方式
    • * 类型转换
    • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档