linker go cgo

linker - ir+cgo y enlazar



(2)

Así es como lo tengo para construir. Tenga en cuenta la línea #cgo LDFLAGS que es probablemente lo que se está perdiendo. Tuve que hacer algunos otros cambios para hacerlo construir. ¡Parece devolver la respuesta correcta en mi máquina Linux!

package tools // #cgo LDFLAGS: -lXss -lX11 // #include <X11/extensions/scrnsaver.h> import "C" func GetIdleTime() (idleTime uint32) { var info *C.XScreenSaverInfo var display *C.Display info = C.XScreenSaverAllocInfo() display = C.XOpenDisplay(nil) defaultRootWindow := C.XDefaultRootWindow(display) C.XScreenSaverQueryInfo(display, C.Drawable(defaultRootWindow), info) idleTime = uint32(info.idle) return }

Quiero usar la siguiente c como Go cgo:

#include <X11/extensions/scrnsaver.h> main() { XScreenSaverInfo *info = XScreenSaverAllocInfo(); Display *display = XOpenDisplay(0); XScreenSaverQueryInfo(display, DefaultRootWindow(display), info); printf("%u ms/n", info->idle); }

construir con:

gcc -o idle printXIdleTime.c -lX11 -lXss

Reescribí ese código para Go cgo:

package tools // #cgo pkg-config: x11 // #include <X11/extensions/scrnsaver.h> import "C" func GetIdleTime() (idleTime uint32) { var info *C.XScreenSaverInfo var display *C.Display info = C.XScreenSaverAllocInfo() display = C.XOpenDisplay(0) defaultRootWindow := C.XDefaultRootWindow(display) C.XScreenSaverQueryInfo(display, defaultRootWindow, info) idleTime = info.idle return }

intentado compilar con:

go build -gccgoflags="-lXss -lX11"

sin embargo, estoy recibiendo errores de enlazador:

/tmp/go-build076004816/opensource.stdk/lib/tools/_obj/x11.cgo2.o: en la función _cgo_c0e279f6f16e_Cfunc_XScreenSaverAllocInfo'': ./x11.go:52: undefined reference to XScreenSaverAllocInfo'' / tmp / go-build076004816 / opensource. stdk / lib / tools / _obj / x11.cgo2.o: en la función _cgo_c0e279f6f16e_Cfunc_XScreenSaverQueryInfo'': ./x11.go:65: undefined reference to XScreenSaverQueryInfo'' collect2: error: ld devuelto 1 estado de salida

¿Qué estoy haciendo mal?


Tenga en cuenta que esto se puede hacer con el enlace nativo X Go y la extensión ScreenSaver:

package main import ( "fmt" "log" "github.com/BurntSushi/xgb" "github.com/BurntSushi/xgb/xproto" "github.com/BurntSushi/xgb/screensaver" ) func main() { X, err := xgb.NewConn() if err != nil { log.Fatal(err) } if err = screensaver.Init(X); err != nil { log.Fatal(err) } root := xproto.Setup(X).DefaultScreen(X).Root info, err := screensaver.QueryInfo(X, xproto.Drawable(root)).Reply() if err != nil { log.Fatal(err) } fmt.Printf("Idle: %d/n", info.MsSinceUserInput) }

Productos:

[andrew@Liger go] go run xscreensaver_idle.go Idle: 1040