2016-08-05 30 views
1

Ich habe einen Wrapper für die Semaphor-Funktionen in Linux geschrieben. Dies funktionierte für mich in der Vergangenheit auf Go 1.3 und Go 1.4, aber ich musste meine Anwendung mit diesem Wrapper neu erstellen und es wird nicht mehr mit Go 1.6.2 oder Go 1.7rc5 erstellt.cgo cross-compile Fehler beim Suchen von Bibliotheken

ich eine einfache Test Anwendung geschrieben, die die gleichen Fehler produziert:

package main 

import (
    "fmt" 
    "os" 
    "linux/semaphore" 
) 

func main() { 
    var sema semaphore.Semaphore 
    if err := sema.Open("/test", 0644, 1); err != nil { 
     fmt.Printf("%v\n", err) 
     os.Exit(1) 
    } 
    if err := sema.TryWait(); err != nil { 
     fmt.Printf("%v\n", err) 
     os.Exit(1) 
    } 
    if err := sema.Post(); err != nil { 
     fmt.Printf("%v\n", err) 
     os.Exit(1) 
    } 
} 

Jetzt wird das Programm kompiliert nativ (Linux/amd64), ist mein Problem, wenn ich versuche, Cross-kompilieren für Linux/Arm (Ti am3352).

Bisher alles, was ich tun musste, war:

GOOS=linux GOARCH=arm GOARM=7 CGO_ENABLED=1 CC=/am335x_toolchain/bin/armv7l-timesys-linux-gnueabi-gcc go build 

die jetzt die folgende Fehlermeldung gibt:

# runtime/cgo 
/tmp/go-build820923984/runtime/cgo/_obj/_cgo_export.c:2:20: fatal error: stdlib.h: No such file or directory 
#include <stdlib.h> 
        ^
compilation terminated. 

Also ich den Include-Pfad angegeben:

GOOS=linux GOARCH=arm GOARM=7 CGO_ENABLED=1 CC=/am335x_toolchain/bin/armv7l-timesys-linux-gnueabi-gcc CGO_CFLAGS="-I/am335x_toolchain/include" go build 
# runtime/cgo 
/am335x_toolchain/bin/../lib/gcc/armv7l-timesys-linux-gnueabi/4.8.3/../../../../armv7l-timesys-linux-gnueabi/bin/ld: cannot find Scrt1.o: No such file or directory 
/am335x_toolchain/bin/../lib/gcc/armv7l-timesys-linux-gnueabi/4.8.3/../../../../armv7l-timesys-linux-gnueabi/bin/ld: cannot find crti.o: No such file or directory 
/am335x_toolchain/bin/../lib/gcc/armv7l-timesys-linux-gnueabi/4.8.3/../../../../armv7l-timesys-linux-gnueabi/bin/ld: cannot find -lpthread 
collect2: error: ld returned 1 exit status 

Schließlich bekam ich zu diesem, was immer noch nicht funktioniert:

GOOS=linux GOARCH=arm GOARM=7 CGO_ENABLED=1 CC=/am335x_toolchain/bin/armv7l-timesys-linux-gnueabi-gcc CGO_LDFLAGS="-L/am335x_toolchain/lib -pthread" CGO_CFLAGS="-I/am335x_toolchain/include" go build 
# runtime/cgo 
/am335x_toolchain/bin/../lib/gcc/armv7l-timesys-linux-gnueabi/4.8.3/../../../../armv7l-timesys-linux-gnueabi/bin/ld: cannot find Scrt1.o: No such file or directory 
/am335x_toolchain/bin/../lib/gcc/armv7l-timesys-linux-gnueabi/4.8.3/../../../../armv7l-timesys-linux-gnueabi/bin/ld: cannot find crti.o: No such file or directory 
/am335x_toolchain/bin/../lib/gcc/armv7l-timesys-linux-gnueabi/4.8.3/../../../../armv7l-timesys-linux-gnueabi/bin/ld: cannot find /lib/libpthread.so.0 
/am335x_toolchain/bin/../lib/gcc/armv7l-timesys-linux-gnueabi/4.8.3/../../../../armv7l-timesys-linux-gnueabi/bin/ld: cannot find /usr/lib/libpthread_nonshared.a 
collect2: error: ld returned 1 exit status 

Die pthread-Bibliothek nicht vorhanden ist:

$ ls /am335x_toolchain/lib | grep "libpthread*" 
libpthread-2.18.so 
libpthread.a 
libpthread_nonshared.a 
libpthread.so 
libpthread.so.0 

Alle Hinweise auf das, was ich brauche, mit CGO Cross-kompilieren zu tun? Scheint so, als hätte ich bei jeder Veröffentlichung mehr Probleme mit CGO.

EDIT:

Ich habe entdeckt, das ist ein Problem mit der Host-Architektur. Ich bekomme die oben genannten Probleme beim Ausführen auf einem x86_64-Rechner (Linux). Wenn ich mit Go 1.6 auf einem 32bit x86-Rechner (Linux) kompiliere, baut es ohne Fehler auf. Habe noch keine Lösung gefunden, auf der 64-Bit-Maschine zu kompilieren.

+0

Haben Sie versucht, '$ CC' zu' $ CC_FOR_TARGET' zu ersetzen? Siehe [hier] (https://golang.org/cmd/cgo/). –

+0

@ SiuChingPong-AsukaKenji- $ CC_FOR_TARGET soll beim Erstellen der Toolchain mit make.bash verwendet werden. $ CC wird verwendet, um ein Programm zu kompilieren. Ich habe versucht, die Toolchain mit CC_FOR_TARGET neu aufzubauen, aber ich bekomme den gleichen Fehler beim Ausführen des Go-Tools. – dangeroushobo

+0

Vielleicht würde etwas wie '--sysroot/am335x_toolchain /' sowohl in 'CGO_CFLAGS' als auch' CGO_LDFLAGS' helfen? –

Antwort

3

Also das Problem ist, dass für den Cross-Compiler seine Header und Bibliotheken richtig zu finden, es braucht eine --sysroot option, in Ihrem Fall --sysroot /am335x_toolchain/ hinzugefügt sowohl zu CGO_CFLAGS und CGO_LDFLAGS.