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

时间:2014-10-17 06:13:18

标签: go makefile

我因此而拔头发。

我想要做的就是将.o(C对象文件)与Go包链接起来,以便Go包可以调用C函数。

似乎没有关于cgo的CGO_OFILES参数的任何文档,这似乎是我在多次上网搜索后所需要的。

我已经尝试将其放在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 $^

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

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

2 个答案:

答案 0 :(得分:3)

  1. 您可以使用SWIG,因为它可以为您提供更多功能。我刚刚学会了将它与C ++(example)一起使用,但该过程与C类似99%。您可以在静态和动态链接之间进行选择,两种方法都可以。
  2. 您可以通过定义正确的标志来强制CGO静态链接(example,尤其是提到的github repo!)。
  3. #2的例子:

    // #cgo CFLAGS: -Isrc/include  
    // Where doc-capi-tesseract.h is!
    // #cgo LDFLAGS: doc-capi-tesseract.a
    // #include "doc-capi-tesseract.h"
    
    import "C"
    

答案 1 :(得分:0)

使用 .syso ,而不是 .o 扩展程序。

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