我想使用以下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 toXScreenSaverAllocInfo中/tmp/go- build076004816/opensource.stdk/lib/tools/_obj/x11.cgo2.o:在函数_cgo_c0e279f6f16e_Cfunc_XScreenSaverQueryInfo': ./x11.go:65: undefined reference toXScreenSaverQueryInfo’collect2中:错误:ld返回1退出状态
_cgo_c0e279f6f16e_Cfunc_XScreenSaverAllocInfo': ./x11.go:52: undefined reference to
_cgo_c0e279f6f16e_Cfunc_XScreenSaverQueryInfo': ./x11.go:65: undefined reference to
我究竟做错了什么?
这就是我如何构建它。注意这#cgo LDFLAGS行可能是您所缺少的。我必须进行其他一些更改才能构建它。它似乎在我的Linux机器上返回了正确的答案!
#cgo LDFLAGS
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 }