2015-01-20 4 views
5

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

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

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

флаги для ОЦП в 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 ? , так что я могу построить проект на любом пути. Благодаря!

ответ

6

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

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

+0

Получил это !, Спасибо за ваше объяснение! –

+0

Начиная с go1.5.4, '#cgo LDFLAGS: -L $ {SRCDIR}/testserver -ltest' работает правильно. – akavel

0

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

Кроме того, $ {SRCDIR} указывает абсолютный путь к текущему ходу файла. Используйте команду 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 

Это incrrect, потому что Lib libaes.a находит такой же, как файл идут. Тогда я изменил его и прошел.

 Смежные вопросы

  • Нет связанных вопросов^_^