2015-06-17 6 views
7

Die kommende Version von Go 1.5 wird mit new buildmodes geliefert, mit der Go-Symbole exportiert und aus C-Code aufgerufen werden können. Ich habe damit herumgespielt und grundlegende "Hallo Welt" -Beispiele funktionierte, aber jetzt versuche ich eine Go-Bibliothek zu verknüpfen, die eine net/http.Server startet und es scheitert. Der Code sieht wie folgt aus (it's also available here):Verwenden von Go 1.5 buildmode = c-Archiv mit net/http.Server verknüpft von C

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

Beispiele/c/main.c:

#include <stdio.h> 
#include "../../gohttplib.h" 

int main() 
{ 
    ListenAndServe(":8000"); 
    return 0; 
} 

Herstellung des statisch gelinkte Objekt und Header funktioniert gut:

$ go build -buildmode=c-archive 

Aber dagegen Kompilieren versagt:

$ 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 

Dies ist eine aktuelle Version aus dem Go Github-Repository (38e3427) auf OS X 10.9.5 verwenden. Ich verstehe, dass Go 1.5 noch nicht veröffentlicht wurde und dass es keine Garantie dafür gibt, dass es funktioniert, aber ich mache das für Bildungszwecke und ich vermute, dass mir etwas fehlt.

Verwandte Versionen:

$ 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 
+0

Arbeitet für mich auf Version 'a2aaede' und Ubuntu 14.04. Hast du versucht, auf eine neuere Version zu aktualisieren? –

+0

Gezogen 'a2aaede', dasselbe Problem für mich obwohl. Kann irgendwie mit OSX verwandt sein, obwohl gcc-5 in ähnlicher Weise fehlschlägt. – shazow

+0

Es könnte sich lohnen, [dann ein Problem] (https://github.com/golang/go/issues/new) darüber zu öffnen. –

Antwort

7

dieses Problem gibt es auf OSX/Darwin stellte sich heraus. Um dies zu umgehen, müssen wir dem Verknüpfungsbefehl gcc -framework CoreFoundation -framework Security Optionen hinzufügen. Der endgültige Befehl sieht wie folgt aus:

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

Diese Anforderung wird möglicherweise in einer zukünftigen Version von Go entfernt. Weitere Diskussion zu diesem Thema hier: https://github.com/golang/go/issues/11258