猿问

使用 Go 1.5 buildmode=c-archive 和从 C 链接的

即将发布的 Go 1.5 带有新的构建模式,允许导出要从 C 代码链接和调用的 Go 符号。我一直在玩它,并获得了基本的“Hello world”示例,但现在我正在尝试链接一个 Go 库,它启动了 anet/http.Server并且它失败了。代码如下所示(也可在此处获得):


gohttplib.go:


package main


import "C"

import "net/http"


//export ListenAndServe

func ListenAndServe(caddr *C.char) {

    addr := C.GoString(caddr)

    http.ListenAndServe(addr, nil)

}


func main() {}

示例/c/main.c:


#include <stdio.h>

#include "../../gohttplib.h"


int main()

{

    ListenAndServe(":8000");

    return 0;

}

生成静态链接的对象和标题工作正常:


$ go build -buildmode=c-archive

但是针对它进行编译失败了:


$ gcc -o gohttp-c examples/c/main.c gohttplib.a -lpthread

Undefined symbols for architecture x86_64:

  "_CFArrayGetCount", referenced from:

      _FetchPEMRoots in gohttplib.a(000003.o)

  "_CFArrayGetValueAtIndex", referenced from:

      _FetchPEMRoots in gohttplib.a(000003.o)

  "_CFDataAppendBytes", referenced from:

      _FetchPEMRoots in gohttplib.a(000003.o)

  "_CFDataCreateMutable", referenced from:

      _FetchPEMRoots in gohttplib.a(000003.o)

  "_CFDataGetBytePtr", referenced from:

      _FetchPEMRoots in gohttplib.a(000003.o)

      __cgo_6dbb806e9976_Cfunc_CFDataGetBytePtr in gohttplib.a(000003.o)

     (maybe you meant: __cgo_6dbb806e9976_Cfunc_CFDataGetBytePtr)

  "_CFDataGetLength", referenced from:

      _FetchPEMRoots in gohttplib.a(000003.o)

      __cgo_6dbb806e9976_Cfunc_CFDataGetLength in gohttplib.a(000003.o)

     (maybe you meant: __cgo_6dbb806e9976_Cfunc_CFDataGetLength)

  "_CFRelease", referenced from:

      _FetchPEMRoots in gohttplib.a(000003.o)

      __cgo_6dbb806e9976_Cfunc_CFRelease in gohttplib.a(000003.o)

     (maybe you meant: __cgo_6dbb806e9976_Cfunc_CFRelease)

这是在 OS X 10.9.5 上使用 Go github 存储库 (38e3427) 中的最新版本。我知道 Go 1.5 还没有发布,并且不能保证它可以工作,但我这样做是出于教育目的,我怀疑我遗漏了一些东西。

人到中年有点甜
浏览 300回答 1
1回答
随时随地看视频慕课网APP

相关分类

Go
我要回答