将Golang与XLib链接起来

时间:2013-08-14 16:53:59

标签: go cgo

我正在尝试使用此代码在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)

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

2 个答案:

答案 0 :(得分:6)

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));
}

答案 1 :(得分:1)

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

其次,你的cgo参数需要直接附加到“C”导入,所以必须阅读

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

import (
  // your other imports
)