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