Search code examples
gocgo

Linking Golang with XLib


I am trying to use XLib within Go using this code:

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

I'm compiling this via:

go tool cgo $(FILE)

But it results in the following error messages:

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)

Any idea how to solve this?


Solution

  • cgo is picky about the formatting: you need to keep the "C" import separate, and place the preamble comments immediately above:

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