Wie verbindet man eine c-Bibliothek in go statisch mit cgo?
So gibt es eine Reihe von Sachen auf, die Gruppe schlägt vor, dass Sie können dies tun, gehen (allerdings nicht auf der cgo-Dokumentation):
package bridge
import "fmt"
//#cgo CFLAGS: -I/Users/doug/projects/c/go-bridge/include
//#cgo LDFLAGS: /Users/doug/projects/c/go-bridge/build/libgb.a
//#include <junk.h>
import "C"
func Run() {
fmt.Printf("Invoking c library...\n")
C.x(10)
fmt.Printf("Done\n")
}
Aber es scheint nicht zu funktionieren:
/var/folders/.../bridge.a(bridge.cgo2.o)(__TEXT/__text): x: not defined
Dieser scheint gut zu funktionieren mit der dynamischen Bibliothek, und untersuchen die generierten Dateien, die es tatsächlich hat das symbol 'x' drin:
/var/folders/rg/hj4s3qlj3sz1d1b5p50ws0vc0000gn/T/go-build442792776/bridge/_obj/_cgo_.o:
0000000100001048 S _NXArgc
0000000100001050 S _NXArgv
0000000100001060 S ___progname
0000000100000dc0 T __cgo_2d7eefe3d6d4_Cfunc_x
0000000100000da0 T __cgo_allocate
0000000100000db0 T __cgo_panic
0000000100000000 T __mh_execute_header
0000000100000d90 T _crosscall2
0000000100001058 S _environ
U _exit
0000000100000d80 T _main
U _puts
0000000100001000 s _pvars
0000000100000de0 T _x <------- Exists
U dyld_stub_binder
0000000100000d40 T start
aber offensichtlich ist nur eine Markierung in der Brücke.cgo2.o:
/var/folders/rg/hj4s3qlj3sz1d1b5p50ws0vc0000gn/T/go-build442792776/bridge.a(bridge.cgo2.o):
0000000000000368 s EH_frame0
0000000000000000 T __cgo_2d7eefe3d6d4_Cfunc_x
0000000000000380 S __cgo_2d7eefe3d6d4_Cfunc_x.eh
U _x
Was mache ich falsch?
Für ref, die c-header:
int x(int y);
Und code:
#include <junk.h>
#include <stdio.h>
int x(int y) {
printf("Hello World\n");
return y;
}
--
Edit:
Nein, -L und -l nicht funktioniert, entweder; es ist eigentlich eine spezifische Diskussion über die google-Gruppe, zu der diese (-l/blah/blah.a) funktioniert nicht für cgo, und die korrekte syntax ist in der Tat weglassen -l und nur eine Liste der .eine Datei... aber hey, wenn Sie gearbeitet hatten, würde ich ganz einfach. Aber es funktioniert nicht:
dougs-mini:go doug$ go run test.go
# bridge
ld: library not found for -l/Users/doug/projects/c/go-bridge/build/libgb.a
collect2: ld returned 1 exit status
dougs-mini:go doug$ ls -l /Users/doug/projects/c/go-bridge/build/libgb.a
-rw-r--r-- 1 doug staff 872 25 May 14:02 /Users/doug/projects/c/go-bridge/build/libgb.a
ausführliche version:
dougs-mini:go doug$ go build -work -x test.go
WORK=/var/folders/rg/hj4s3qlj3sz1d1b5p50ws0vc0000gn/T/go-build354497708
mkdir -p $WORK/bridge/_obj/
cd /Users/doug/projects/c/go-bridge/go/src/bridge
/Users/doug/projects/go/go/pkg/tool/darwin_amd64/cgo -objdir $WORK/bridge/_obj/ -- -I/Users/doug/projects/c/go-bridge/include -I $WORK/bridge/_obj/ bridge.go
/Users/doug/projects/go/go/pkg/tool/darwin_amd64/6c -FVw -I $WORK/bridge/_obj/ -I /Users/doug/projects/go/go/pkg/darwin_amd64 -o $WORK/bridge/_obj/_cgo_defun.6 -DGOOS_darwin -DGOARCH_amd64 $WORK/bridge/_obj/_cgo_defun.c
gcc -I . -g -O2 -fPIC -m64 -pthread -fno-common -I/Users/doug/projects/c/go-bridge/include -I $WORK/bridge/_obj/ -o $WORK/bridge/_obj/_cgo_main.o -c $WORK/bridge/_obj/_cgo_main.c
gcc -I . -g -O2 -fPIC -m64 -pthread -fno-common -I/Users/doug/projects/c/go-bridge/include -I $WORK/bridge/_obj/ -o $WORK/bridge/_obj/_cgo_export.o -c $WORK/bridge/_obj/_cgo_export.c
gcc -I . -g -O2 -fPIC -m64 -pthread -fno-common -I/Users/doug/projects/c/go-bridge/include -I $WORK/bridge/_obj/ -o $WORK/bridge/_obj/bridge.cgo2.o -c $WORK/bridge/_obj/bridge.cgo2.c
gcc -I . -g -O2 -fPIC -m64 -pthread -fno-common -o $WORK/bridge/_obj/_cgo_.o $WORK/bridge/_obj/_cgo_main.o $WORK/bridge/_obj/_cgo_export.o $WORK/bridge/_obj/bridge.cgo2.o -l/Users/doug/projects/c/go-bridge/build/libgb.a
# bridge
ld: library not found for -l/Users/doug/projects/c/go-bridge/build/libgb.a
collect2: ld returned 1 exit status
Es ist erwähnenswert, dass die Fehler, wenn Sie versuchen, zu verknüpfen, wie dies (mit -l) ist typisch für gcc andernfalls zu verknüpfen, da Sie versucht sind, kombinieren eine Reihe von Objekt-Dateien.
ie. Diese:
gcc -I . -g -O2 -fPIC -m64 -pthread -fno-common -o ... -l/path/libgb.a
Wird nie kompiliert unter gcc; Sie muss link eine statische Bibliothek so:
gcc -I . -g -O2 -fPIC -m64 -pthread -fno-common -o ... /path/libgb.a
ie. Es ist absolut nicht so, dass ich ' m fehlt ein -l oder -L.
InformationsquelleAutor der Frage Doug | 2013-05-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Stellt sich heraus, mein code ist 100% in Ordnung; es war eine Kopie von Go 1.0; unter gehen 1.1 das funktioniert.
Unter gehe 1.0, gibt es nicht.
(es ist ein bisschen lame, die Beantwortung meiner eigenen Frage, ich weiß; aber '- L -l nachfolgenden Antworten sind nicht ganz richtig; es hatte nichts zu tun).
Funktionierende Lösung Beispiel ist auf github hier für alle, die finden, die diese Frage später:
https://github.com/shadowmint/go-static-linking
kurz gesagt, dass sieht aus wie:
siehe auch:
https://github.com/golang/go/issues/9344
InformationsquelleAutor der Antwort Doug
Du nur noch die Verknüpfung mit -Ldirectory -lgb.
InformationsquelleAutor der Antwort Didier Spezia
Eine einfache Makefile link-code mit dynamischen oder statische Bibliothek:
Richtlinien in der Brücke.go:
InformationsquelleAutor der Antwort algorix
Versuchen:
Verpasst die
-l
in die LDFLAGS-Richtlinie.InformationsquelleAutor der Antwort Intermernet