2015-01-20 38 views
5

Sono nuovo di golang, e sto cercando di costruire un programma che utilizza un golang lib statica (.a file) structCome utilizzare un percorso relativo per LDFLAGS in golang

la directory per il mio progetto, come di seguito

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

le bandiere per CGO nel test.go come di seguito

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

quando sto usando percorso assoluto per LDFLAGS -L, funziona multe, ma quando cambio il percorso di un percorso relativo, ad es.

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

e quindi eseguire il comando

go install testserver 

restituisce un errore per me, e dice: "non può trovare -ltest"

la mia domanda è come posso utilizzare un percorso relativo a LDFLAGS ? , così da poter costruire il progetto in qualsiasi percorso. Grazie!

risposta

6

Attualmente non è possibile. La directory cambia tra il momento in cui viene generato il comando e il collegamento. Per ora è necessario un collegamento a un percorso assoluto o utilizzare la variabile di ambiente CGO_LDFLAGS.

C'è stato un commit subito dopo go1.4 che ha aggiunto una variabile ${SRCDIR} che viene sostituita dal percorso assoluto della directory contenente il file di origine in fase di compilazione. https://github.com/golang/go/issues/7891. Questo sarà in go1.5, e puoi facilmente usarlo ora costruendo Go from source.

+0

Ottenuto !, Grazie per la spiegazione! –

+0

A partire da go1.5.4, '#cgo LDFLAGS: -L $ {SRCDIR}/testserver -ltest' funziona correttamente. – akavel

0

E 'davvero molto grande usare $ {} srcdir per risolvere il problema di percorso relativo.

Inoltre, i $ {} SRCDIR indica il percorso assoluto del file corrente go. Utilizzare il comando go build -x . per verificare l'output.

$ 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 

E 'incrrect, perché il lib libaes.a individua lo stesso del file di movimento. Poi ho cambiato e passato.