2015-01-20 10 views
5

Jestem nowy golang, a ja staram się zbudować program golang który wykorzystuje statyczny lib (.a plik)Jak użyć ścieżki względnej dla LDFLAGS w golang

katalog struct dla mojego projektu, jak poniżej

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

flagi dla CGO w test.go jak poniżej

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

kiedy używam bezwzględną ścieżkę do LDFLAGS -L, to działa grzywny, ale kiedy zmienić ścieżkę do ścieżki względnej, np.

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

a następnie uruchomić komendę

go install testserver 

zwraca błąd do mnie i mówi: „Nie można odnaleźć -ltest”

moje pytanie brzmi: w jaki sposób można użyć ścieżki względnej w LDFLAGS ? , abym mógł zbudować projekt na dowolną ścieżkę. Dzięki!

Odpowiedz

6

Obecnie nie możesz. Katalog zmienia się między czasem utworzenia polecenia a łączeniem. Na razie musisz połączyć się z bezwzględną ścieżką lub użyć zmiennej środowiskowej CGO_LDFLAGS.

Nastąpił commit tuż po wersji go1.4, która dodała zmienną ${SRCDIR}, którą zastępuje bezwzględna ścieżka do katalogu zawierającego plik źródłowy w czasie kompilacji. https://github.com/golang/go/issues/7891. Będzie to w wersji 1.5, a teraz możesz go łatwo użyć, budując Go ze źródła.

+0

Rozumiem! Dziękuję za wyjaśnienia! –

+0

Od wersji go.5.4, '#cgo LDFLAGS: -L $ {SRCDIR}/testserver -ltest' działa poprawnie. – akavel

0

To naprawdę bardzo wielki używać $ {SRCDIR} aby rozwiązać problem ścieżkę względną.

Ponadto $ {SRCDIR} wskazuje bezwzględną ścieżkę bieżącego odchodzenia pliku. Użyj polecenia go build -x ., aby sprawdzić dane wyjściowe.

$ 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 

To incrrect, ponieważ lib libaes.a lokalizuje taka sama jak pliku iść. Potem zmieniłem to i przekazałem.

Powiązane problemy