猿问

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

因为这个,我正在拔头发。


我想要做的就是将 .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.inc

TARG=tesseract

CGOFILES=tesseract.go

CGO_OFILES=doc-capi-tesseract.o

include $(GOROOT)/src/Make.pkg


%.o: %.cpp

    $(HOST_CC) $(CGO_CFLAGS_$(GOARCH)) -g -O2 -fPIC -o $@ -c $^

但我不知道如何处理该文件。如果我运行makeormake myfile或 ,则不会发生任何事情go build makefile。不知道如何使用它。


有人可以向我解释如何将 Go 文件链接到 C 目标文件吗?


GCT1015
浏览 229回答 2
2回答

一只萌萌小番薯

您可以使用SWIG,因为它为您提供了更多功能。我刚刚学会了将它与 C++(示例)一起使用,但该过程与 C 99% 相似。您可以在静态和动态链接之间进行选择,这两种方法都可以使用。您可以通过定义正确的标志来强制 CGO 静态链接(例如,尤其是提到的 github repo!)。#2 的示例:// #cgo CFLAGS: -Isrc/include&nbsp;&nbsp;// Where doc-capi-tesseract.h is!// #cgo LDFLAGS: doc-capi-tesseract.a// #include "doc-capi-tesseract.h"import "C"

小唯快跑啊

使用.syso 而不是.o扩展名。go build现在会自动将在 derecory 中找到的每个 .syso 文件链接到您的二进制文件中。
随时随地看视频慕课网APP

相关分类

Go
我要回答