4

我正在尝试从C 构建以下示例?去?加油!

package print

/*
#include <stdio.h>
#include <stdlib.h>
*/
import "C"
import "unsafe"

func Print(s string) {
    cs := C.CString(s)
    C.fputs(cs, (*C.FILE)(C.stdout))
    C.free(unsafe.Pointer(cs))
}

我在 Win7 64 上运行 Go,并使用来自http://tdm-gcc.tdragon.net/的 GCC 的 64 位版本, 在 Linux 上运行它不是一种选择。

我得到的错误是:

could not determine kind of name for C.stdout

我无法找到有关此消息的任何文档,而且 Google 上显示的点击率也很少。

有人对造成这种情况的原因有任何想法吗?提前致谢!

4

2 回答 2

4

这是在 Windows 上访问 C.stdout 的一种方法:

// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package stdio

/*
#include <stdio.h>
// on mingw, stderr and stdout are defined as &_iob[FILENO]
// on netbsd, they are defined as &__sF[FILENO]
// and cgo doesn't recognize them, so write a function to get them,
// instead of depending on internals of libc implementation.
FILE *getStdout(void) { return stdout; }
FILE *getStderr(void) { return stderr; }
*/
import "C"

var Stdout = (*File)(C.getStdout())
var Stderr = (*File)(C.getStderr())

https://github.com/golang/go/blob/master/misc/cgo/stdio/stdio.go

于 2012-09-26T05:47:00.150 回答
0

在 cgo 实现中,有一种方法可以根据 gcc 的输出猜测类型。您可能在终端中设置了不同的语言环境并且猜测失败。

试试这个:

LC_ALL=C go build
于 2012-09-26T01:37:14.030 回答