首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >go + cgo与链接

go + cgo与链接
EN

Stack Overflow用户
提问于 2013-02-12 22:24:06
回答 2查看 3K关注 0票数 6

我想使用下面的c作为Go的cgo:

代码语言:javascript
复制
#include <X11/extensions/scrnsaver.h>

main() {
  XScreenSaverInfo *info = XScreenSaverAllocInfo();
  Display *display = XOpenDisplay(0);

  XScreenSaverQueryInfo(display, DefaultRootWindow(display), info);
  printf("%u ms\n", info->idle);
}

用:

代码语言:javascript
复制
gcc -o idle printXIdleTime.c -lX11 -lXss

我重写了Go的cgo代码:

代码语言:javascript
复制
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
}

试图用:

代码语言:javascript
复制
go build -gccgoflags="-lXss -lX11"

然而,我得到链接器错误:

/tmp/go-build076004816/opensource.stdk/lib/tools/_obj/x11.cgo2.o: In _cgo_c0e279f6f16e_Cfunc_XScreenSaverAllocInfo': ./x11.go:52: undefined reference toXScreenSaverAllocInfo‘/tmp/go-build076004816/opensource.stdk/lib/tools/_obj/x11.cgo2.o: In function _cgo_c0e279f6f16e_Cfunc_XScreenSaverQueryInfo': ./x11.go:65: undefined reference toXScreenSaverQueryInfo’collect2:错误: ld返回1退出状态

我做错什么了?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-12 23:06:45

这就是我要建造的地方。注意#cgo LDFLAGS行,这可能是您缺少的内容。我不得不做一些其他的改变,以使它的建立。它似乎在我的Linux机器上返回了正确的答案!

代码语言:javascript
复制
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
}
票数 5
EN

Stack Overflow用户

发布于 2013-02-13 16:44:40

请注意,这可以通过本机X Go结合和ScreenSaver扩展来完成:

代码语言:javascript
复制
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)
}

产出:

代码语言:javascript
复制
[andrew@Liger go] go run xscreensaver_idle.go 
Idle: 1040
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14842980

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档