go - 使用 cgo 包装 <dispatch/dispatch.h> 时构建错误

标签 go

我正在尝试使用 XPC、GCD 和 go,但是当我的代码无法编译并出现以下错误消息(我不明白)时,我很快就碰壁了:

main(__DATA/__const):动态符号 _NSConcreteGlobalBlock 的意外重定位 main(__DATA/__const):_NSConcreteGlobalBlock 的未处理重定位(类型 28 rtype 120)

我正在使用 go build 编译以下代码:

ma​​in.go

package main

/*
#include <xpc/xpc.h>
#include "wrapper.h"
*/
import "C"

import (
    "fmt"
)

//export HandleXPCEvent
func HandleXPCEvent(event C.xpc_object_t) {
    fmt.Println("Event was handled")
}

func main() {
    name := C.CString("com.example.xpc")
    queue := C.dispatch_queue_create(name, nil)
    conn := C.xpc_connection_create(name, queue)
    C.set_event_handler(conn)

    //C.xpc_connection_resume(conn)
}

包装器.h

#ifndef _WRAPPER_H_
#define _WRAPPER_H_

#include <stdlib.h>
#include <stdio.h>
#include <xpc/xpc.h>

xpc_connection_t connect( char* name);
void set_event_handler(xpc_connection_t connection);

#endif

wrapper.c

#include "wrapper.h"
#include <dispatch/dispatch.h>

extern void HandleXPCEvent(xpc_object_t);

xpc_connection_t connect( char* name) {
    dispatch_queue_t queue = dispatch_queue_create(name,0);
    return xpc_connection_create(name,queue);
}

void set_event_handler(xpc_connection_t connection) {
    xpc_connection_set_event_handler(connection, ^(xpc_object_t event) {
        xpc_retain(event);
        // Call Go function
        HandleXPCEvent(event);
    });
}

我是不是做错了什么?这是某种 go bug 还是如何修复?


更新:

我在我的项目上运行 go build -x -work 并得到以下输出:

➣ go build -x -work
WORK=/var/folders/fb/bgfqk8wx5x16w7yh2cg50vrw0000gn/T/go-build524335717
mkdir -p $WORK/github.com/gabrielayuso/go-xpc/_obj/
mkdir -p $WORK/github.com/gabrielayuso/go-xpc/_obj/exe/
cd /Users/gabrielayuso/Documents/Workspace/Projects/go/src/github.com/gabrielayuso/go-xpc
/usr/local/go/pkg/tool/darwin_amd64/cgo -objdir $WORK/github.com/gabrielayuso/go-xpc/_obj/ -- -I $WORK/github.com/gabrielayuso/go-xpc/_obj/ main.go
/usr/local/go/pkg/tool/darwin_amd64/6c -F -V -w -I $WORK/github.com/gabrielayuso/go-xpc/_obj/ -I /usr/local/go/pkg/darwin_amd64 -o $WORK/github.com/gabrielayuso/go-xpc/_obj/_cgo_defun.6 -D GOOS_darwin -D GOARCH_amd64 $WORK/github.com/gabrielayuso/go-xpc/_obj/_cgo_defun.c
gcc -I . -g -O2 -fPIC -m64 -pthread -fno-common -print-libgcc-file-name
gcc -I . -g -O2 -fPIC -m64 -pthread -fno-common -I $WORK/github.com/gabrielayuso/go-xpc/_obj/ -o $WORK/github.com/gabrielayuso/go-xpc/_obj/_cgo_main.o -c $WORK/github.com/gabrielayuso/go-xpc/_obj/_cgo_main.c
gcc -I . -g -O2 -fPIC -m64 -pthread -fno-common -I $WORK/github.com/gabrielayuso/go-xpc/_obj/ -o $WORK/github.com/gabrielayuso/go-xpc/_obj/_cgo_export.o -c $WORK/github.com/gabrielayuso/go-xpc/_obj/_cgo_export.c
gcc -I . -g -O2 -fPIC -m64 -pthread -fno-common -I $WORK/github.com/gabrielayuso/go-xpc/_obj/ -o $WORK/github.com/gabrielayuso/go-xpc/_obj/main.cgo2.o -c $WORK/github.com/gabrielayuso/go-xpc/_obj/main.cgo2.c
gcc -I . -g -O2 -fPIC -m64 -pthread -fno-common -I $WORK/github.com/gabrielayuso/go-xpc/_obj/ -o $WORK/github.com/gabrielayuso/go-xpc/_obj/wrapper.o -c ./wrapper.c
gcc -I . -g -O2 -fPIC -m64 -pthread -fno-common -o $WORK/github.com/gabrielayuso/go-xpc/_obj/_cgo_.o $WORK/github.com/gabrielayuso/go-xpc/_obj/_cgo_main.o $WORK/github.com/gabrielayuso/go-xpc/_obj/_cgo_export.o $WORK/github.com/gabrielayuso/go-xpc/_obj/main.cgo2.o $WORK/github.com/gabrielayuso/go-xpc/_obj/wrapper.o
/usr/local/go/pkg/tool/darwin_amd64/cgo -objdir $WORK/github.com/gabrielayuso/go-xpc/_obj/ -dynimport $WORK/github.com/gabrielayuso/go-xpc/_obj/_cgo_.o -dynout $WORK/github.com/gabrielayuso/go-xpc/_obj/_cgo_import.c
/usr/local/go/pkg/tool/darwin_amd64/6c -F -V -w -I $WORK/github.com/gabrielayuso/go-xpc/_obj/ -I /usr/local/go/pkg/darwin_amd64 -o $WORK/github.com/gabrielayuso/go-xpc/_obj/_cgo_import.6 -D GOOS_darwin -D GOARCH_amd64 $WORK/github.com/gabrielayuso/go-xpc/_obj/_cgo_import.c
gcc -I . -g -O2 -fPIC -m64 -pthread -fno-common -o $WORK/github.com/gabrielayuso/go-xpc/_obj/_all.o $WORK/github.com/gabrielayuso/go-xpc/_obj/_cgo_export.o $WORK/github.com/gabrielayuso/go-xpc/_obj/main.cgo2.o $WORK/github.com/gabrielayuso/go-xpc/_obj/wrapper.o -Wl,-r -nostdlib /usr/llvm-gcc-4.2/bin/../lib/gcc/i686-apple-darwin11/4.2.1/x86_64/libgcc.a
/usr/local/go/pkg/tool/darwin_amd64/6g -o $WORK/github.com/gabrielayuso/go-xpc/_obj/_go_.6 -p github.com/gabrielayuso/go-xpc -D _/Users/gabrielayuso/Documents/Workspace/Projects/go/src/github.com/gabrielayuso/go-xpc -I $WORK $WORK/github.com/gabrielayuso/go-xpc/_obj/_cgo_gotypes.go $WORK/github.com/gabrielayuso/go-xpc/_obj/main.cgo1.go
/usr/local/go/pkg/tool/darwin_amd64/pack grcP $WORK $WORK/github.com/gabrielayuso/go-xpc.a $WORK/github.com/gabrielayuso/go-xpc/_obj/_go_.6 $WORK/github.com/gabrielayuso/go-xpc/_obj/_cgo_import.6 $WORK/github.com/gabrielayuso/go-xpc/_obj/_cgo_defun.6 $WORK/github.com/gabrielayuso/go-xpc/_obj/_all.o
cd .
/usr/local/go/pkg/tool/darwin_amd64/6l -o $WORK/github.com/gabrielayuso/go-xpc/_obj/exe/a.out -L $WORK $WORK/github.com/gabrielayuso/go-xpc.a
# github.com/gabrielayuso/go-xpc
main(__DATA/__const): unexpected reloc for dynamic symbol _NSConcreteGlobalBlock
main(__DATA/__const): unhandled relocation for _NSConcreteGlobalBlock (type 28 rtype 120)

go build -x -work 生成的 $WORK 目录内容:go-xpc_work.zip

我对编译和链接不是很熟悉,因此我无法理解这个输出。我刚刚注意到 _cgo_import.c 由 cgo 生成的文件(带有选项 -dynimport-dynout)有 #pragma cgo_import_dynamic _NSConcreteGlobalBlock第一行中的 _NSConcreteGlobalBlock "" 与链接器给出的错误消息相关。

希望这些信息可以帮助找出问题所在以及如何解决。

最佳答案

我对这些库知之甚少,但你这里的代码没有让我印象深刻。

可以从 go build -x -work 获得一些有用的调试输出,它将为您打印命令和工作目录。

工作目录将保持不变,因此您可以查看 cgo 为您生成的代码。再加上它将为您打印的命令,您应该可以开始追踪问题。

关于go - 使用 cgo 包装 <dispatch/dispatch.h> 时构建错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17477311/

相关文章:

Go:像 Java 的 CyclicBarrier 这样的可重用屏障?

javascript - 如何使用 grpc-web 进行流式传输并在同一端口上使用 REST API?

go - http.get ("https://poe.ninja/data") 返回 "https://poe.ninja"而不是域的所需路径

去测试验证 connect2id 给出 "invalid_client"错误

go - sort.Sort 不修改数组

json - Golang 不能使用 as type struct array 或 slice literal

go - bytes.Buffer 的限制?

mongodb - 在 golang 中连接到远程 mongodb 服务器失败,出现身份验证错误

来自操作系统的音频流

Gosublime:它如何在工作时向我显示函数的参数信息