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

Golang:如何使用 CGO_OFILES 链接 C 对象?

Golang:如何使用 CGO_OFILES 链接 C 对象?

Go
GCT1015 2021-08-23 16:37:54
因为这个,我正在拔头发。我想要做的就是将 .o(C 目标文件)与 Go 包链接起来,以便 Go 包可以调用 C 函数。似乎没有关于CGO_OFILEScgo 参数的任何文档,这似乎是我经过大量互联网搜索后所需要的。我试过把它放在 Go 文件的顶部:/*#cgo CGO_OFILES: doc-capi-tesseract.o#include <stdlib.h>#include "doc-capi-tesseract.h"*/import "C"但这给了我错误invalid #cgo verb: #cgo CGO_OFILES: doc-capi-tesseract.o。然后我在某处读到可以使用makefile,所以我制作了这个可能不正确的makefile:include $(GOROOT)/src/Make.incTARG=tesseractCGOFILES=tesseract.goCGO_OFILES=doc-capi-tesseract.oinclude $(GOROOT)/src/Make.pkg%.o: %.cpp    $(HOST_CC) $(CGO_CFLAGS_$(GOARCH)) -g -O2 -fPIC -o $@ -c $^但我不知道如何处理该文件。如果我运行makeormake myfile或 ,则不会发生任何事情go build makefile。不知道如何使用它。有人可以向我解释如何将 Go 文件链接到 C 目标文件吗?
查看完整描述

2 回答

?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

您可以使用SWIG,因为它为您提供了更多功能。我刚刚学会了将它与 C++(示例)一起使用,但该过程与 C 99% 相似。您可以在静态和动态链接之间进行选择,这两种方法都可以使用。

您可以通过定义正确的标志来强制 CGO 静态链接(例如,尤其是提到的 github repo!)。

#2 的示例:


// #cgo CFLAGS: -Isrc/include  

// Where doc-capi-tesseract.h is!

// #cgo LDFLAGS: doc-capi-tesseract.a

// #include "doc-capi-tesseract.h"


import "C"


查看完整回答
反对 回复 2021-08-23
?
小唯快跑啊

TA贡献1863条经验 获得超2个赞

使用.syso 而不是.o扩展名。

go build现在会自动将在 derecory 中找到的每个 .syso 文件链接到您的二进制文件中。


查看完整回答
反对 回复 2021-08-23
  • 2 回答
  • 0 关注
  • 228 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信