我有一个完全用C编写的项目。我只需要调用一个必须在GO中编码的函数。因此我使用cgo来构建C文件,然后我想使用生成的目标文件链接到我的主C项目。
假设我有一个文件foo.go
,单个函数func HelloWorld()
。我希望从我的C代码中执行此功能。
所以我做了以下步骤
# go tool cgo foo.go
# cd _obj && gcc -c *.o
现在我有两个文件:
# _cgo_export.o _cgo_main.o
然而,main()
正在以某种方式定义在那里,我无法将这些目标文件与我的主项目(多个主管)链接。
如何让cgo不要放入虚拟主体?或者我这样做完全错了?
编辑我需要入口点在C中。其他人发布的建议要求入口点在GO中。我已经在下面发布了正确的解决方案,感谢另外一位我信用的用户。
来自@alexander(https://stackoverflow.com/users/131264/alexander)的答案解决了这个问题。
如果你使用gccgo,这不是一个令人困惑的主张。这适用于:
foo.go
package main
func Add(a, b int) int {
return a + b
}
bar.c
#include <stdio.h>
extern int go_add(int, int) __asm__ ("example.main.Add");
int main() {
int x = go_add(2, 3);
printf("Result: %d\n", x);
}
Makefile文件
all: main
main: foo.o bar.c
gcc foo.o bar.c -o main
foo.o: foo.go
gccgo -c foo.go -o foo.o -fgo-prefix=example
clean:
rm -f main *.o