如何在没有定义main()的情况下让cgo构建目标文件?

问题描述 投票:0回答:1

我有一个完全用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中。我已经在下面发布了正确的解决方案,感谢另外一位我信用的用户。

c go cgo gccgo
1个回答
0
投票

来自@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
© www.soinside.com 2019 - 2024. All rights reserved.