当前位置: 首页 > 面试题库 >

在现有的C项目中使用Go代码

井誉
2023-03-14
问题内容

自从Go 1.5发布以来,我开始着眼于如何将其集成到我现有的项目中。

该项目的代码库完全用C编写,可以低级访问硬件和其他有趣的东西。但是,某些较高层次的东西很繁琐,我想开始用较高层次的语言(Go)编写它们

我可以通过C程序调用Go代码吗?我安装了Go
1.5,它添加了-buildmode=c-archive(https://golang.org/s/execmodes),我正试图开始工作。

但是,我似乎无法让Go生成适当的头文件来允许我的项目进行实际编译。生成档案时,我在导出的符号中看到了该函数(使用objdump),但是没有包含gcc的头文件,抱怨该函数不存在(按预期)

我对Go语言很陌生-但是,我热爱这种语言,并且想使用它。是否有任何惯用的方式(我在Go的世界中经常使用“惯用” …)来使它们相互配合?

我问这个问题并特别提到Go 1.5的原因是,根据此文档,https://docs.google.com/document/d/1nr-
TQHw_er6GOQRsF6T43GGhFDelrAP0NqSS_00RgZQ/edit?pli
=

1#heading =
h.1gw5ytjfcoke添加了Go 1.5支持非Go程序调用Go代码。具体来说,在“链接到非Go程序并从中调用的Go代码”一节中提到


问题答案:

要构建可从C调用的档案,您需要将其标记为导出的CGo符号。
例如,如果我创建一个foo.go具有以下内容的文件:

package main

import (
    "C"
    "fmt"
)

//export PrintInt
func PrintInt(x int) {
    fmt.Println(x)
}

func main() {}

要注意的重要事项是:

  • 该包需要调用 main
  • 您需要一个main函数,尽管它可以为空。
  • 您需要导入软件包 C
  • 您需要特殊的//export注释来标记要从C调用的函数。

我可以使用以下命令将其编译为C可调用静态库:

go build -buildmode=c-archive foo.go

结果将是一个存档foo.a和一个标头foo.h。在标题中,我们得到以下内容(不相关的部分):

...
typedef long long GoInt64;
...
typedef GoInt64 GoInt;
...
extern void PrintInt(GoInt p0);
...

这样就足以调用导出的函数。我们可以编写一个简单的C程序来调用它,如下所示:

#include "foo.h"

int main(int argc, char **argv) {
    PrintInt(42);
    return 0;
}

我们可以使用以下命令来编译它:

gcc -pthread foo.c foo.a -o foo

-pthread选项是必需的,因为Go运行时使用了线程。当我运行生成的可执行文件时,它会打印出来42



 类似资料:
  • 问题内容: 我有一个完全用C编写的程序,其中使用了多个目标文件。这些文件都打包在一个存档文件中,而该存档文件又在程序主文件的编译时使用。 我想在Go中为此项目编写一个新文件。我的想法是编写此文件,然后从中创建一个目标文件。之后,我想将此对象文件放入已经提到的存档文件中。 这基本上意味着 我想从C程序调用Go函数。我已经阅读了这个问题,虽然它告诉我可以通过GCCGO实现我想要的东西,但是如何做到这一

  • 我有一个现有的Android项目,结构如下: 谢谢!

  • JMH建议您使用他们的原型创建项目。通过将我的代码作为依赖项包含在这个生成的项目中,我能够以这种方式运行我的基准测试代码。 但是,我现在尝试使用配置文件将基准测试直接集成到我的项目源代码中 当我这样做并运行生成的基准测试jar时,我得到一个不兼容的类更改错误 任何指点将不胜感激

  • 我将AWS amplify与auth、dynamodb和GraphQLAPI一起用于react本机应用程序。现在我需要将现有的后端添加到web应用程序。我运行下面的命令,获得带有API、auth和函数的amplify后端文件夹。缺少用于查询和转换的graphql文件夹(graphql客户端)。如何获取GraphQL客户端文件夹以从数据库中获取数据?

  • 问题内容: 我需要一种在Apple平台上从Swift调用Python代码的方法。一个图书馆将是理想的。我已经做了大量的Google搜索,而我发现的最接近的材料是关于Objective- C的。 问题答案: 如果有人对从swift调用python感兴趣,这是我发现的一些有用的材料: python框架-https: //developer.apple.com/library/ios/technotes

  • 我有两个C语言的项目需要在Windows和Linux中运行和构建。我们正在使用Microsoft TFS进行源代码控制。 对于windows,我们使用的是Visual Studio 对于Linux,我们使用Eclipse。(我对Eclipse没有太多经验) 我成功地在这两个平台上正确地配置和构建了项目。 我在TFS登记了。C项目和。来自eclipse的项目,所以我可以在另一台计算机上使用它。 现在