我是Golang的新手,我正在尝试构建一个使用静态库(.a文件)的golang程序
我的项目的目录结构如下
└─testserver
├─bin
├─pkg
└─src
├─logging
└─testserver
├─libtest.a
└─test.go
test.go中的cgo标志如下
// #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中使用相对路径? ,以便我可以在任何路径上构建项目。谢谢!
答案 0 :(得分:7)
你目前不能。目录在构建命令和链接之间发生更改。现在您需要链接到绝对路径,或使用CGO_LDFLAGS
环境变量。
在go1.4之后有一个提交,它添加了一个${SRCDIR}
变量,该变量在构建时被包含源文件的目录的绝对路径替换。 https://github.com/golang/go/issues/7891。这将在go1.5中,您现在可以通过从源代码构建Go来轻松使用它。
答案 1 :(得分: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
它是直接的,因为lib libaes.a
与go文件的位置相同。
然后我改变了它,然后通过了。