Как использовать относительный путь для LDFLAGS в golang

Я пытаюсь создать программу golang, которая использует статическую библиотеку (файл .a)

структура каталога для моего проекта, как показано ниже

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

флаги для cgo в test.go, как показано ниже

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

когда я использую абсолютный путь для LDFLAGS -L, он работает нормально, но когда я меняю путь на относительный путь, например

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

а затем запустите команду

go install testserver

он возвращает мне ошибку и говорит "не удается найти -ltest"

мой вопрос: как я могу использовать относительный путь в LDFLAGS? , так что я могу построить проект по любому пути.


person catric mia    schedule 20.01.2015    source источник


Ответы (2)


В настоящее время вы не можете. Каталог меняется между моментом сборки команды и связыванием. На данный момент вам нужно либо указать абсолютный путь, либо использовать переменную среды CGO_LDFLAGS.

Сразу после go1.4 была фиксация, в которой была добавлена ​​переменная ${SRCDIR}, которая заменяется абсолютным путем к каталогу, содержащему исходный файл, во время сборки. https://github.com/golang/go/issues/7891. Это будет в go1.5, и вы можете легко использовать его сейчас, собрав Go из исходников.

person JimB    schedule 20.01.2015
comment
Понятно! Спасибо за объяснение! - person catric mia; 21.01.2015
comment
Начиная с версии 1.5.4, #cgo LDFLAGS: -L${SRCDIR}/testserver -ltest работает нормально. - person akavel; 08.12.2016

Очень здорово использовать ${SRCDIR} для решения проблемы относительного пути.

Кроме того, ${SRCDIR} указывает абсолютный путь к текущему файлу go. Используйте команду go build -x . для проверки вывода.

$ 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

Это неправильно, потому что библиотека libaes.a находится там же, где и файл go. Потом поменял и прошел.

person eyotang    schedule 27.07.2017