Golang:cgo外部函数不起作用。

3

我正在尝试使用以下示例(在go-wiki -> Global Functions中提供)运行golang的cgo:

foo.go文件:

package gocallback

import "fmt"

/*
#include <stdio.h>
extern void ACFunction();
*/
import "C"

//export AGoFunction
func AGoFunction() {
        fmt.Println("AGoFunction()")
}

func Example() {
        C.ACFunction()
}

foo.c文件:

#include "_cgo_export.h"
void ACFunction() {
    printf("ACFunction()\n");
    AGoFunction();
}

在运行此示例时,我遇到了以下错误:
# command-line-arguments
/tmp/go-build770916112/command-line-arguments/_obj/foo.cgo2.o: In function    `_cgo_3234419c4c2a_Cfunc_ACFunction':
./foo.go:36: undefined reference to `ACFunction'
collect2: ld returned 1 exit status

我无法追踪到这个问题的原因。为什么ACFunctionundefined?还是我漏掉了什么?

go version: go version go1.1.2 linux/386


您提供的简化示例在我这里似乎可以编译通过。不过,您的 foo.go 文件并没有36行,因此您删除的某些代码中是否存在错误呢? - James Henstridge
不,我没有删除任何代码。那行代码也让我感到困惑。你如何编译cgo?我正在使用go run foo.go。是否需要特定的gcc版本或32位/64位机器或其他什么东西? - Jaynti Kanani
我使用了 go build packagename 命令。我在 Linux/amd64 平台上测试了 1.1.2 和 1.2 版本。 - James Henstridge
嗯,那就是问题所在。go run 不起作用,而 go build packagename 则按预期工作。感谢您的指引。 - Jaynti Kanani
1个回答

8
根据问题评论,似乎您正在尝试使用“go run foo.go”构建和运行程序。这将导致“go run: cannot run non-main package”错误,但将包名称转换为“main”并添加“main”函数会重现问题中的错误。这似乎是因为它仅尝试编译“foo.go”文件而非配套的“foo.c”文件。
如果您将文件放在“$GOPATH/src”目录下,并使用“go build packagename”来构建程序,则应成功构建包中的所有源文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接