1 回答
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 编译器将检查声明是否与定义匹配。
添加回答
举报
