【问题标题】:golang: cgo extern is not workinggolang:cgo extern 不工作
【发布时间】:2013-12-29 00:36:48
【问题描述】:

我正在尝试使用以下示例为 golang 运行 cgo(在 go-wiki -> Global Functions 给出):

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: 去版本go1.1.2 linux/386

【问题讨论】:

  • 您的精简示例似乎对我来说可以编译。您的 foo.go 文件没有 36 行,那么您删除的某些代码中是否可能存在错误?
  • 不,我没有删除任何代码。那行部分也让我感到困惑。你如何编译cgo?我正在使用go run foo.go。是否需要任何特定的 gcc 版本或 32 位/64 位机器或任何东西?
  • 我使用了go build packagename。我在 Linux/amd64 上测试了 1.1.2 和 1.2 版本。
  • 嗯。这就是问题所在。 go run 不起作用。 go build packagename 按预期工作。感谢您的指点。

标签: go cgo


【解决方案1】:

根据问题 cmets,您似乎正在尝试使用 go run foo.go 构建和运行程序。

这会失败并出现 go run: cannot run non-main package 错误,但将包名称转换为 main 并添加 main 函数确实会重现问题中的错误。这似乎是因为它试图只编译 foo.go 文件而不是伴随的 foo.c 文件。

如果您将文件放在$GOPATH/src 下的目录中并使用go build packagename 构建程序,它应该可以成功构建包中的所有源文件。

【讨论】:

    猜你喜欢
    • 2014-03-20
    • 1970-01-01
    • 2015-03-31
    • 2023-03-24
    • 2011-07-03
    • 1970-01-01
    • 2012-02-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多