2015-01-20 8 views
5

Ich bin neu in golang, und ich versuche, ein golang Programm zu bauen, die eine statische lib verwendet (.a-Datei)Wie einen relativen Pfad für LDFLAGS in golang verwenden

der Verzeichnis-Struktur für mein Projekt, wie unten

└─testserver 
    ├─bin 
    ├─pkg 
    └─src 
     ├─logging 
     └─testserver 
      ├─libtest.a 
      └─test.go 

die Fahnen für CGO in test.go wie unten

// #cgo LDFLAGS: -L /home/test/testserver/src/testserver -ltest 
// #include "test.h" 
import "C" 

, wenn ich für LDFLAGS -L absoluten Pfad verwenden, funktioniert es Strafen, aber wenn ich den Pfad zu einem relativen Pfad zu ändern, zB

// #cgo LDFLAGS: -L ./testserver -ltest 

und führen Sie dann den Befehl

go install testserver 

es einen Fehler zu mir zurückkommt, und sagt: „nicht finden können, -ltest“

meine Frage ist, wie kann ich einen relativen Pfad in LDFLAGS verwenden ? , damit ich das Projekt auf jedem Pfad erstellen kann. Vielen Dank!

Antwort

6

Sie können derzeit nicht. Das Verzeichnis wechselt zwischen der Erstellung des Befehls und der Verknüpfung. Für den Moment müssen Sie entweder auf einen absoluten Pfad verweisen oder die Umgebungsvariable CGO_LDFLAGS verwenden.

Es gab ein Commit kurz nach go1.4, das eine ${SRCDIR} Variable hinzufügte, die zum Build-Zeitpunkt durch den absoluten Pfad zum Verzeichnis ersetzt wurde, das die Quelldatei enthielt. https://github.com/golang/go/issues/7891. Dies wird in go1.5 sein, und Sie können es jetzt einfach verwenden, indem Sie Go from source erstellen.

+0

Got it!, Vielen Dank für Ihre Erklärung! –

+0

Ab go1.5.4 funktioniert '#cgo LDFLAGS: -L $ {SRCDIR}/testserver -ltest' in Ordnung. – akavel

0

Es ist wirklich sehr groß $ zu verwenden {SRCDIR} das Problem der relativen Pfad zu lösen.

Darüber hinaus sind die $ {} SRCDIR zeigt die absoluten Pfad der aktuellen Go-Datei. Verwenden Sie den Befehl go build -x ., um die Ausgabe zu überprüfen.

$ go build -x . 
... 
cd /root/sourcecode/src/tcp/aes 
CGO_LDFLAGS="-g" "-O2" "-L/root/sourcecode/src/tcp/aes/aes" "-laes" /usr/local/go/pkg/tool/linux_amd64/cgo -objdir $WORK/tcp/aes/_obj/ -importpath tcp/aes -- -I $WORK/tcp/aes/_obj/ aes.go 
cd $WORK 
... 
$ tcp/aes 
/usr/bin/ld: cannot find -laes 
collect2: error: ld returned 1 exit status 

Es ist incrrect, weil die lib libaes.a die gleiche wie die Go-Datei sucht. Dann änderte ich es und passierte.

Verwandte Themen