我想使用以下 c 作为 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);
}
构建:
gcc -o idle printXIdleTime.c -lX11 -lXss
我为 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
}
尝试编译:
go build -gccgoflags="-lXss -lX11"
但是我收到链接器错误:
/tmp/go-build076004816/opensource.stdk/lib/tools/_obj/x11.cgo2.o:在
功能_cgo_c0e279f6f16e_Cfunc_XScreenSaverAllocInfo': ./x11.go:52:
undefined reference to
XScreenSaverAllocInfo'
/tmp/go-build076004816/opensource.stdk/lib/tools/_obj/x11.cgo2.o:在
功能_cgo_c0e279f6f16e_Cfunc_XScreenSaverQueryInfo': ./x11.go:65:
undefined reference to
XScreenSaverQueryInfo'collect2:错误:ld
返回 1 退出状态
我究竟做错了什么?
这就是我构建它的方式。请注意#cgo LDFLAGS
这可能是您所缺少的线。我必须进行一些其他更改才能使其构建。它似乎在我的 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
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)