广告
返回顶部
首页 > 资讯 > 后端开发 > GO >Go 语言中运行 C程序 代码
  • 395
分享到

Go 语言中运行 C程序 代码

2024-04-02 19:04:59 395人浏览 独家记忆
摘要

前言: 在前面多篇 Go 系列文章中,我们了解到,Go 语言脱胎于 C 语言,这就意味着在某些更底层的细节中,我们可以使用 C 语言实现,然后通过 Go 来调用相关的 C 代码。其实

前言:

在前面多篇 Go 系列文章中,我们了解到,Go 语言脱胎于 C 语言,这就意味着在某些更底层的细节中,我们可以使用 C 语言实现,然后通过 Go 来调用相关的 C 代码。其实这一特点,在 Java 的 JVMpython 的解释器也是通过底层是直接调用 C 实现的。

而本篇文章就来学习一下,如何在 Go 语言中运行 C 程序。

一、直接在 Go 代码中写入 C 程序

Go 语言通过 cgo 工具来识别代码中的 C 语言,我们可以通过命令 ​​go env​​ 来查看是否 cgo 工具是否开启。

​​CGO_ENABLED=1​​ 表示 cgo 工具可用,当设置为 0 时,表示工具不可用。

然后我可以新建一个​​CinGo.go​​​ 的程序,然后在注释中写入 c 语言的代码。然后导入 Go 提供的 c 包 ​​import "C"​​ ,Go 语言在看到导入这个包之后就知道如何去处理注释中的内容了。

这里我们在 C 代码中写入要给 ​​callC()​​ 函数,然后在 Go 语言中进行调用:

package main

// #include <stdio.h>
// void callC() {
//   printf("Hello World from C!\n");
// }
import "C"
import "fmt"

func main() {

  fmt.Println("让我们学习 Go 语句调用 C 程序")
  C.callC()
  fmt.Println("调用 C 程序结束")
}

执行结果:

$ go run CinGo.go
让我们学习 Go 语句调用 C 程序
Hello World from C!;'/;'  
调用 C 程序结束

但是,这种方式的 C 代码和 Go 语言代码在同一个文件中,所以大家能明显发现这种方式的代码耦合度太高,仅仅适用于项目简单单一的情形。

一个更合理的方式应该是 C 代码单独在一个文件。

二、Go 直接调用 C 文件

那么,如果已经写好一个封装好的 C 文件代码,Go 语言该如何调用呢?

此时我们需要直接写好 C 代码,因为 Go 代码是无法对 C 代码文件进行重写或者修改的。

​写好 C 头文件​

我们在本地 Go 项目中,创建一个 ​​hello.h​​ 的头文件,

代码如下:

#ifndef HELLO_H
#define HELLO_H

int sayHello(const char *name, char *out);
void printMessage(char *message);
void cHello();
int add(int a, int b);

#endif

​编写 C 文件​

然后编写 ​​hello.c​​ 文件,如下:

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

int sayHello(const char *name, char *out) {
    int n;

    n = sprintf(out, "Hello, My name is %s!", name);

    return n;
}

void cHello() {
    printf("Hello from C!\n");
}

void printMessage(char* message) {
    printf("从 Go 语言接收的信息: %s\n", message);
}

int add(int a, int b) {
    return a + b;
}

​写好 Go 代码​

最后编写我们的 ​​main.go​​ 语言:

  • 我们需要在 CFLAGS 参数中填入我们的 GOPath 路径,​​#cgo CFLAGS: -I /Users/yuzhou_1su/go/src/CinGo​​
  • 然后在 LSFLAGS 中填入我们的 C 编译后的本地链接文件:​​#cgo LDFLAGS: /Users/yuzhou_1su/go/src/CinGo/hello.a​​ 
package main

// #cgo CFLAGS: -I /Users/yuzhou_1su/go/src/CinGo
// #cgo LDFLAGS: /Users/yuzhou_1su/go/src/CinGo/hello.a
// #include <stdlib.h>
// #include <hello.h>
import "C"

import (
    "fmt"
    "unsafe"
)

func main() {

    C.cHello()

    a := C.int(1024)
    b := C.int(2022)
    result := C.add(a, b)
    fmt.Println("Reuslt is:", result)

    goMessage := C.CString("This is Go")
    defer C.free(unsafe.Pointer(goMessage))
    C.printMessage(goMessage)

}

​最后代码结构如下:

然后我们首先编译 c 代码:

$ GCc -c *.c      

$ /usr/bin/ar rs hello.a *.o
ar: creating arcHive hello.a
$ rm hello.o

然后再执行 Go 代码,结果如下:

$ go run main.go         
Hello from C!
Reuslt is: 3046

从 Go 语言接收的信息: This is Go

总结:

在编写上述的小案例过程你中的,都出现了了很多小问题,比如 C 代码和 ​​import "c"​​  语句之间不能有空格。经常会出现找不到 C 函数等等问题。

​总得来说,日常 Go 开发还是不需要此类高级用法,也就是说其实我们平常编程过程中不太需要 cgo,大多数情况下还是尽量用 Go 语言自己实现。如果确实需要使用 C 语言,还是得多去了解 ​ ​cgo​​ 的文档,以防出错。

到此这篇关于Go 语言中运行 C程序 代码 的文章就介绍到这了,更多相关Go中运行 C 代码 内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文档:

--结束END--

本文标题: Go 语言中运行 C程序 代码

本文链接: https://www.lsjlt.com/news/143448.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Go 语言中运行 C程序 代码
    前言: 在前面多篇 Go 系列文章中,我们了解到,Go 语言脱胎于 C 语言,这就意味着在某些更底层的细节中,我们可以使用 C 语言实现,然后通过 Go 来调用相关的 C 代码。其实...
    99+
    2022-11-13
  • ubuntu如何运行c语言代码
    要在Ubuntu上运行C语言代码,您可以按照以下步骤进行操作:1. 打开终端:可以通过按下Ctrl+Alt+T键或在应用程序菜单中搜...
    99+
    2023-08-28
    ubuntu c语言
  • go语言代码怎么转c语言
    go语言代码转c语言方法:1、将Go代码转换为LLVM IR;2、使用LLVM提供的工具将LLVM IR转换为C语言代码;3、使用C语言编译器(如GCC)将生成的C代码编译成可执行文件。本教程操作环境:windows10系统、golang1...
    99+
    2023-07-10
  • c语言怎么运行多个程序
    要在C语言中运行多个程序,可以使用多线程或者多进程的方式。 多线程: 可以使用pthread库来创建和管理多个线程。首先,需要包...
    99+
    2023-10-27
    c语言
  • c语言程序写好后怎么运行
    在Windows系统上,可以使用集成开发环境(IDE)如Code::Blocks、Dev-C++、Visual Studio等来编写...
    99+
    2023-10-25
    c语言
  • Linux系统如何运行C语言程序
    这篇文章给大家介绍Linux系统如何运行C语言程序,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。在Linux系统中如何运行C语言程序?打开安装好的Linux系统(ubuntu18.04)1.安装编辑器使用语句:sudo...
    99+
    2023-06-28
  • C语言怎么设置程序的运行时间
    在C语言中,可以使用time.h头文件中的clock()函数来获取程序的运行时间。clock()函数返回从程序启动起算的时钟周期数,...
    99+
    2023-08-31
    C语言
  • VS Code中怎么安装运行、编写C语言程序
    这篇文章主要介绍“VS Code中怎么安装运行、编写C语言程序”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“VS Code中怎么安装运行、编写C语言程序”文章能帮助大家解决问题。...
    99+
    2023-07-05
  • C语言实现烟花表白程序代码
    目录效果图烟花爆炸效果思路代码素材总结效果图 烟花爆炸效果思路 不能直接把烟花图片贴到窗口中,需要把烟花的像素点保存到二维数组中,以相同的半径大小把烟花输出到窗口中爆炸的位置,r...
    99+
    2022-11-13
  • VSCode中安装运行、编写C语言程序的详细教程
    目录1.下载 安装VS Code2.安装VS code中2个插件3.下载mingb644.配置系统的环境变量5.C语言配置6.编写一个测试程序1.下载 安装VS Code 去官网下载...
    99+
    2023-03-13
    VS Code 编写运行C语言程序 VS Code 编写C语言程序
  • C语言实现数独程序的示例代码
    目录程序截图简单说明代码实现程序截图 简单说明 随机生成数独的算法见力扣上对应题目的题解,我用的是递归回溯法 力扣原题 先随机放入 11 个数就能生成一个数独然后求数独的解最后...
    99+
    2023-03-03
    C语言实现数独游戏 C语言数独程序 C语言数独
  • c语言代码没错但运行不出来如何解决
    当你的C语言代码没有错误,但运行不出来时,可能存在以下几种问题和解决方案:1. 编译问题:确保你的代码已成功编译。如果编译失败,可能...
    99+
    2023-08-31
    c语言
  • 详解如何在Go语言中调用C源代码
    目录开坑说明内嵌形式外置的C代码1. 构建libauth.a静态库2. 对main.go稍加修改3. 编译开坑说明 最近在编写客户端程序或与其他部门做功能集成时多次碰到了跨语言...
    99+
    2022-06-07
    GO go语言
  • c语言四则运算程序如何写
    下面是一个简单的C语言四则运算程序的示例:#include int main() {int num1, num2;char oper...
    99+
    2023-08-24
    c语言
  • C语言实现ATM系统程序的完整代码
    实现效果如图: 代码如下: #include<stdio.h> #include<string.h> #include<conio.h> #...
    99+
    2022-11-12
  • Go 语言分布式编程教程:让你的程序规模化运行!
    随着互联网技术的快速发展,分布式系统成为了当前互联网领域中最受欢迎的架构之一。而 Go 语言作为一种高效、可靠、易于编写的编程语言,也成为了分布式系统开发者的首选语言。本篇文章将为大家介绍如何使用 Go 语言编写分布式系统,并演示一些示例...
    99+
    2023-08-26
    分布式 教程 面试
  • c语言快速排序代码怎么写
    下面是一个使用C语言实现快速排序的示例代码:```c#include // 交换两个元素的值void swap(int* a, in...
    99+
    2023-10-11
    c语言
  • C语言动态顺序表实例代码
    目录顺序表概念:一.准备工作二、顺序表的基本操作 1.顺序表的初始化函数2.尾插函数(在尾部插入数据)3.头插函数(在数组头部插入数据) 4.尾删函数5.头删函数6.在第pos的位置...
    99+
    2022-11-12
  • C语言实战之浪漫烟花表白程序代码
    创建win32控制台应用程序,选择空项目。 创建完毕后,右击头文件新建一个头文件(.h)。名字写main.h 然后在源文件新建一个C++文件(.cpp)。名字写main.cpp 如图...
    99+
    2022-11-12
  • 如何在容器中运行GO语言程序,实现文件处理操作?
    在现代软件开发中,容器技术已经成为了一个不可或缺的组成部分。容器可以帮助开发人员将应用程序与其依赖项打包到一个单独的可移植容器中,从而加快应用程序的部署和管理。而在容器中运行Go语言程序也是一种流行的方式。在本文中,我们将介绍如何在容器中运...
    99+
    2023-08-03
    http 容器 文件
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作