为了账号安全,请及时绑定邮箱和手机立即绑定

CGo 不编译 C 文件

CGo 不编译 C 文件

跃然一笑 2022-09-26 19:31:33
我有一个非常简单的设置:一个 .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和其他两个函数)应该被多次定义。我无法让它构建我的更改。顺便说一句,如果我将源文件复制/移动到另一个目录并在那里构建它们,则更改将适用(仅一次,再次)。
查看完整描述

1 回答

?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

问题的核心是你的设置是错误的:你的Go代码应该在Cgo前缀中,只有你想要单独编译的任何C代码的标头。例如:#include


package main


/*

#include "pmdk.h"

*/

import "C"


func main() {

    C.helloWorld()

}

您可以将 C 代码放入前缀中:


package main


/*

#include <stdio.h>

void helloWorld() {

        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.h


void func(int arg1, char *arg2);

另外,C代码将显示为:


#include "fifth.h"


void func(int zorg, char *evil) {

    // ...

}

并且 C 编译器将检查声明是否与定义匹配。


查看完整回答
反对 回复 2022-09-26
  • 1 回答
  • 0 关注
  • 238 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号