Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linker go+;cgo与链接_Linker_Go_Cgo - Fatal编程技术网

Linker go+;cgo与链接

Linker go+;cgo与链接,linker,go,cgo,Linker,Go,Cgo,我想使用以下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",

我想使用以下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);
}
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的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);
}
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
}
但是,我收到链接器错误:

/tmp/go-build076004816/opensource.stdk/lib/tools/_obj/x11.cgo2.o:In 函数
\u cgo\u c0e279f6f16e\u Cfunc\u XScreenSaverAllocInfo':./x11.go:52:
对
XScreenSaverAllocInfo'的未定义引用 /tmp/go-build076004816/opensource.stdk/lib/tools/_obj/x11.cgo2.o:In 函数
\u cgo\u c0e279f6f16e\u Cfunc\u XScreenSaverQueryInfo':./x11.go:65:
未定义对
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
}
软件包工具
//#cgo LDFLAGS:-lXss-lX11
//#包括
输入“C”
func GetIdleTime()(idleTime uint32){
var info*C.XScreenSaverInfo
变量显示*C显示
info=C.XScreenSaverAllocInfo()
显示=C.xOpen显示(无)
defaultRootWindow:=C.XDefaultRootWindow(显示)
C.XScreenSaverQueryInfo(显示,C.Drawable(defaultRootWindow),信息)
空闲时间=uint32(信息空闲)
返回
}

请注意,这可以通过本机和屏幕保护程序扩展完成:

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)
}
产出:

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

gos XGB的问题是,如果我的家庭中没有.XAuthority,那么NewConn()将失败,并显示消息“Can not connect”(无法连接),XGB将发出警告消息,但无论如何都要连接。您能否提交一份带有测试用例和环境描述的bug报告?