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

标签 c go cgo gccgo

我有一个完全用 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 不放入虚拟 main?还是我这样做完全错了?

编辑我需要入口点在 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);
}

生成文件

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

关于c - 如何在没有定义 main() 的情况下让 cgo 构建目标文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48105754/

相关文章:

c - 需要帮助理解 while 循环

c - 如果有人没有写任何东西就进入然后它应该终止

mongodb - mgo:查找类型为 number (int, float64) 的字段不起作用

go - 变量在包含的模板(html/template)中不起作用

在 Go 中更改 WebKitWebSettings cgo

c - 如何替换newlib的malloc

C 预处理器变量连接 "."

go - 使用公共(public) channel 聚合来自多个 goroutine 的结果

c - 通过Cgo访问aerospike C客户端报错

go - cgo如何抑制警告