In the upcoming release of Go 1.5, there are new buildmodes that allow you to export Go characters that need to be linked and called from C code. I play with it and get the basic "Hello world" examples, but now I'm trying to link the Go library that runs net/http.Server and it does not work. The code looks like this ( it is also available here ):
gohttplib.go:
package main import "C" import "net/http"
Examples of /C/main.c:
#include <stdio.h> #include "../../gohttplib.h" int main() { ListenAndServe(":8000"); return 0; }
Creating statically linked objects and headers works great:
$ go build -buildmode=c-archive
But compilation against it fails:
$ 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
The latest version is used from the Go github repository (38e3427) in OS X 10.9.5. I understand that Go 1.5 has not yet been released and that there are no guarantees that it works, but I do it for educational purposes, and I suspect that something is missing.
Similar versions:
$ ld -v @(
c linker go ld gccgo
shazow
source share