去+ cgo和链接 [英] go + cgo and linking

查看:348
本文介绍了去+ cgo和链接的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

  #include< X11 / extensions / scrnsaver.h> 

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

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

$ / code $ / pre
$ b $ p

  gcc -o idle printXIdleTime.c -lX11 -lXss 

我重写了Go的cgo代码:

 包工具

// #cgo pkg -config:x11
// #include< X11 / extensions / scrnsaver.h>
导入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:In
function _cgo_c0e279f6f16e_Cfunc_XScreenSaverAllocInfo':./x11。 go:52:
未定义引用
XScreenSaverAllocInfo'
/tmp/go-build076004816/opensource.stdk/lib/tools/_obj/x11.cgo2.o:In
函数 _cgo_c0e279f6f16e_Cfunc_XScreenSaverQue ryInfo':./x11.go:65:
未定义引用
XScreenSaverQueryInfo'collect2:错误:ld
返回1退出状态


blockquote>

我做错了什么?

解决方案

建立。请注意 #cgo LDFLAGS 这一行,这可能是您所缺少的。我必须做一些其他更改才能构建。它似乎是在我的Linux机器上返回正确答案!

 包工具

//# cgo LDFLAGS:-lXss -lX11
// #include< X11 / extensions / scrnsaver.h>
导入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
}


i want to use the following c as Go's 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);
}

build with:

gcc -o idle printXIdleTime.c -lX11 -lXss

i re-wrote that code for Go's 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
}

tried to compile with:

go build -gccgoflags="-lXss -lX11"

however i'm getting linker errors:

/tmp/go-build076004816/opensource.stdk/lib/tools/_obj/x11.cgo2.o: In function _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: error: ld returned 1 exit status

what am i doing wrong?

解决方案

This is how I got it to build. Note the #cgo LDFLAGS line which is probably what you are missing. I had to make a few other changes to make it build. It seems to be returning the right answer on my Linux machine!

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和链接的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆