3

我正在尝试使用以下代码在 Go 中使用 XLib:

package main

// #cgo LDFLAGS: -lX11
// #include <X11/Xlib.h>
import (
    "C"
    "fmt"
)

func main() {
    var dpy = C.XOpenDisplay(nil);
    if dpy == nil {
        panic("Can't open display")
    }

    fmt.Println("%ix%i", C.XDisplayWidth(), C.XDisplayHeight());
}

我正在通过以下方式编译它:

go tool cgo $(FILE)

但它会导致以下错误消息:

1: error: 'XOpenDisplay' undeclared (first use in this function)
1: note: each undeclared identifier is reported only once for each function it appears in
1: error: 'XDisplayWidth' undeclared (first use in this function)
1: error: 'XDisplayHeight' undeclared (first use in this function)

知道如何解决这个问题吗?

4

2 回答 2

8

cgo 对格式很挑剔:您需要将“C”导入分开,并将序言注释放在上面:

package main

// #cgo LDFLAGS: -lX11
// #include <X11/Xlib.h>
import "C"

import (
    "fmt"
)

func main() {

    var dpy = C.XOpenDisplay(nil)
    if dpy == nil {
        panic("Can't open display")
    }

    fmt.Println("%ix%i", C.XDisplayWidth(dpy, 0), C.XDisplayHeight(dpy, 0));
}
于 2013-08-14T17:12:00.757 回答
2

首先,你不想go tool cgo直接使用,除非你有特定的理由这样做。go build像不使用 cgo 的项目一样继续使用。

其次,您的 cgo 参数需要直接附加到“C”导入,因此必须读取

// #cgo LDFLAGS: -lX11
// #include <X11/Xlib.h>
import "C"

import (
  // your other imports
)
于 2013-08-14T17:14:02.070 回答