CGo 不编译 C 文件

我有一个非常简单的设置:一个 .go 文件(测试.go)和一个 .c 文件 (PMDK.c)。我在Go中包含.c文件,如下所示:


测试.go:


package main


/*

#include "PMDK.c"

#cgo pkg-config: libpmem

*/

import "C"


func main() {

    C.helloWorld()

}

当我运行 go run test.go 时,它只构建了一次。无论我对PMDK.c进行任何更改,我的程序每次都有完全相同的行为。


我还尝试了去构建test.go,这导致了同样的结果。最后,在CGo不在同一目录中编译C文件之后,我只是去构建。这不起作用,因为我必须创建一个.mod文件(去构建测试.go)。然后,问题在于PMDK.c中的三个函数(helloWorld和其他两个函数)应该被多次定义。我无法让它构建我的更改。顺便说一句,如果我将源文件复制/移动到另一个目录并在那里构建它们,则更改将适用(仅一次,再次)。


跃然一笑
浏览 239回答 1
1回答

宝慕林4294392

问题的核心是你的设置是错误的:你的Go代码应该在Cgo前缀中,只有你想要单独编译的任何C代码的标头。例如:#includepackage main/*#include "pmdk.h"*/import "C"func main() {&nbsp; &nbsp; C.helloWorld()}您可以将 C 代码放入前缀中:package main/*#include <stdio.h>void helloWorld() {&nbsp; &nbsp; &nbsp; &nbsp; printf("hello world from C\n");}*/import "C"...但是,如果将 C 代码放入单独的文件(等)中,则应创建一个小型头文件,该文件仅声明每个函数,以及来自 C 代码和 Go 代码的头文件。1prog.c#include运行:go build然后,如果 C 代码已更改,则编译 C 代码,如果已更改,则生成 Go 代码,并根据需要将两者链接在一起。如果像以前一样将 C 代码直接放入 Go 包中,则将生成 C 代码并生成包含 C 代码的 Go 代码,这就是获取重复定义的原因。#includego build您在 Cgo 标头中嵌入的任何 C 代码都不应出现在其他位置。这是放置小型“管道适配器”的好地方,如果您有一些现有的C代码主要与Go一起使用,但需要一些调整。1这是 C 中的一项常规技术,用于确保函数的头文件声明与相同函数的 C 源定义一致。也就是说,标头可能会说:fifth.hvoid func(int arg1, char *arg2);另外,C代码将显示为:#include "fifth.h"void func(int zorg, char *evil) {&nbsp; &nbsp; // ...}并且 C 编译器将检查声明是否与定义匹配。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python