当前位置: 首页 > 面试题库 >

去+ CGO和链接

刁茂才
2023-03-14
问题内容

我想使用以下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 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
}


 类似资料:
  • 问题内容: 我想知道实现的原因: 更具体地说,我的意思是C紧密循环与go例程调度中的Go循环有何不同。即使应该在Go程序结束时突然终止C紧密循环,我还是想知道依靠这种行为来启动C任务而不阻塞Go程序是否安全。 问题答案: 运行时无法抢占真正的繁忙循环。没有调度点的CPU密集型循环必须位于其自己的线程中,其他goroutine才能运行。函数调用和通道发送或接收操作都产生。网络IO是异步调度的,文件I

  • cgo

    import "runtime/cgo" cgo 包含有 cgo 工具生成的代码的运行时支持。 使用cgo来查看关于cgo命令的详情。

  • 问题内容: 是否有可能使Go中的垃圾收集器处理并释放通过C代码分配的内存?抱歉,我之前没有使用过C和cgo,因此我的示例可能需要澄清。 假设您有一些要使用的C库,并且该库分配了一些需要手动释放的内存。我想做的是这样的: 当Go运行时中没有对* Stuff的引用时,垃圾收集器是否可以调用Stuff.Free()? 我在这里有意义吗? 也许更直接的问题是:是否有可能通过编写一个在该对象的引用为零时运行

  • 问题内容: 我有一个Go库,它为C ++ OpenImageIO库(OpenImageiGO)提供绑定。我一直在通过与libOpenImageIO的标准动态链接来构建绑定,但现在尝试静态链接。我遇到了一个问题,无论我尝试使用哪种标志组合,外部链接器都会失败,并出现大量“未定义的引用”错误。我似乎回想起过去曾提到过的这个问题,他说链接器看到符号的顺序存在问题。但我似乎再也找不到此信息。 这是我最近一

  • 下面是一个使用cgo的例子: package rand /* #include <stdlib.h> */ import "C" func Random() int { return int(C.random()) } func Seed(i int) { C.srandom(C.uint(i)) } rand包导入了"C",但是在Go的标准库中并没有一个"C"包。这是因为

  • 问题内容: 因此,该小组中有很多建议您可以随时进行的工作(尽管不在cgo文档中): 但是,它似乎不起作用: 使用动态库,并检查生成的文件,这似乎可以很好地工作,它实际上在其中带有符号“ x”: 但显然只是bridge.cgo2.o中的标记: 我究竟做错了什么? 对于ref,c标头: 和代码: -- 编辑: 不,-L和-l也不起作用;实际上,在Google网上论坛上有一些具体讨论,认为该(-l /