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

I'm pulling my hair out because of this.

All I want to do is link a .o (C object file) with a Go package so the Go package can call the C functions.

There does not appear to be any documentation on CGO_OFILES parameter of cgo, which appears to be what I need after much Internet searching.

I've tried putting this at the top of the Go file:

/*
#cgo CGO_OFILES: doc-capi-tesseract.o
#include <stdlib.h>
#include "doc-capi-tesseract.h"
*/
import "C"

But that gives me the error invalid #cgo verb: #cgo CGO_OFILES: doc-capi-tesseract.o. Then I read somewhere that a makefile can be used, so I made this probably incorrect 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 $^

But I have no idea then what to do with that file. Nothing happens if I run make or make myfile or go build makefile. No idea how to use it.

Could someone please explain to me how to link a Go file to a C object file?

duanjuebiao6730
duanjuebiao6730 我不是在创建GoGettable存储库,而是供我自己内部使用的可执行文件。
接近 6 年之前 回复
dstobkpm908182
dstobkpm908182 我认为关键是您不应该将二进制文件或目标文件放在gettable存储库中。
接近 6 年之前 回复
dongmu5815
dongmu5815 我设法链接到.a不知道这是否对您有帮助?(github.com/d2g/gomq)
接近 6 年之前 回复
dongmou1964
dongmou1964 我不知道。您要链接的目标文件是从C源代码生成的,还是从字面意义上讲是一个目标文件?
接近 6 年之前 回复
duanmao1319
duanmao1319 您是说它曾经存在但在当前版本中不存在?如果是这样,那么肯定一定要用其他东西代替它吗?
接近 6 年之前 回复
doupiao1893
doupiao1893 我想它已经消失了。仔细研究cgo的来源,我找不到任何引用。
接近 6 年之前 回复
drjk87189
drjk87189 在几个不同的地方都提到过。如果您搜索它,将会看到。虽然没有记录。
接近 6 年之前 回复
dsf6565
dsf6565 是什么使您相信存在CGO_OFILES变量?
接近 6 年之前 回复

2个回答




  1. 您可以使用 SWIG ,因为它为您提供了更多的多功能性。 我刚刚学会使用C ++(示例),但是过程与之有99%的相似性 C.您可以在静态链接和动态链接之间进行选择,这两种方法都可以。</ li>
  2. 您可以强制CGO进行静态链接(示例,尤其请参见提到的github repo!)。</ li>
    </ ol>

    #2的示例:</ p>

      // #cgo CFLAGS:-Isrc / include 
    //其中doc-capi-tesseract.h 是!
    // #cgo LDFLAGS:doc-capi-tesseract.a
    // #include“ doc-capi-tesseract.h”

    导入“ C”
    </ code> </ pre> \ n </ div>

展开原文

原文

  1. You could use SWIG because it gives you more versatility. I just learnt myself to use it with C++ (example) but the process is 99% similar with C. You can choose between static and dynamic linking, both approaches will work.
  2. You can force CGO to link statically (example, see especially the mentioned github repo!) by defining correct flags.

Example to #2:

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

import "C"



使用 .syso </ strong>,而不是 .o </ strong>扩展名。</ p> \ n

开始构建</ strong>现在可以自动将在存储区中找到的每个.syso文件链接到您的二进制文件中。</ p>
</ div>

展开原文

原文

Use .syso istead of .o extension.

go build now automatically links every .syso files found in derectory into your binary.

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐