自从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的项目,所以我可以在另一台计算机上使用它。 现在