Usando Go 1.5 buildmode = c-archive con net / http.Server enlazado desde C

La próxima versión de Go 1.5 viene con nuevos modos de construcción que permiten que los símbolos Go de exportación se vinculen y llamen desde el código C. He estado jugando con él y tengo ejemplos básicos de “Hola mundo” funcionando, pero ahora estoy tratando de vincular una biblioteca Go que inicia un net/http.Server y está fallando. El código se ve así ( también está disponible aquí ):

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() {} 

ejemplos / c / main.c:

 #include  #include "../../gohttplib.h" int main() { ListenAndServe(":8000"); return 0; } 

Producir el objeto y los encabezados enlazados estáticamente funciona bien:

 $ go build -buildmode=c-archive 

Pero la comstackción en contra está fallando:

 $ 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) "_SecKeychainItemExport", referenced from: _FetchPEMRoots in gohttplib.a(000003.o) "_SecTrustCopyAnchorCertificates", referenced from: _FetchPEMRoots in gohttplib.a(000003.o) "_kCFAllocatorDefault", referenced from: _FetchPEMRoots in gohttplib.a(000003.o) ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation) make: *** [example-c] Error 1 

Esto está usando una versión reciente del repository Go github (38e3427) en OS X 10.9.5. Entiendo que Go 1.5 aún no se lanzó y que no hay garantías de que funcione, pero lo hago con fines educativos y sospecho que me estoy perdiendo algo.

Versiones relacionadas:

 $ ld -v @(#)PROGRAM:ld PROJECT:ld64-241.9 configured to support archs: armv6 armv7 armv7s arm64 i386 x86_64 x86_64h armv6m armv7m armv7em LTO support using: LLVM version 3.5svn $ gcc --version Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1 Apple LLVM version 6.0 (clang-600.0.57) (based on LLVM 3.5svn) Target: x86_64-apple-darwin13.4.0 Thread model: posix 

Resulta que este problema existe en OSX / darwin. Para -framework CoreFoundation -framework Security , debemos agregar las opciones de -framework CoreFoundation -framework Security al comando de enlace de gcc. El comando final se ve así:

 $ gcc -o gohttp-c examples/c/main.c gohttplib.a \ -framework CoreFoundation -framework Security -lpthread 

Este requisito puede eliminarse en una versión futura de Go. Más discusión sobre este tema aquí: https://github.com/golang/go/issues/11258