如何在 golang 中使用 LDFLAGS 的相对路径
How to use a relative path for LDFLAGS in 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
它 returns 对我来说是一个错误,并说 "cannot find -ltest"
我的问题是如何在 LDFLAGS 中使用相对路径? ,这样我就可以在任何路径中构建项目。
您目前不能。目录在构建命令和 linking 之间发生变化。现在你要么需要 link 绝对路径,要么使用 CGO_LDFLAGS
环境变量。
在 go1.4 之后有一个提交,它添加了一个 ${SRCDIR}
变量,该变量在构建时被替换为包含源文件的目录的绝对路径。 https://github.com/golang/go/issues/7891。这将在 go1.5 中,您现在可以通过从源代码构建 Go 轻松地使用它。
用${SRCDIR}解决相对路径[=25的问题真的非常棒=].
另外,${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
这是错误的,因为lib libaes.a
与go 文件的位置相同。
然后我改了一下,通过了。
我正在尝试构建一个使用静态库(.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
它 returns 对我来说是一个错误,并说 "cannot find -ltest"
我的问题是如何在 LDFLAGS 中使用相对路径? ,这样我就可以在任何路径中构建项目。
您目前不能。目录在构建命令和 linking 之间发生变化。现在你要么需要 link 绝对路径,要么使用 CGO_LDFLAGS
环境变量。
在 go1.4 之后有一个提交,它添加了一个 ${SRCDIR}
变量,该变量在构建时被替换为包含源文件的目录的绝对路径。 https://github.com/golang/go/issues/7891。这将在 go1.5 中,您现在可以通过从源代码构建 Go 轻松地使用它。
用${SRCDIR}解决相对路径[=25的问题真的非常棒=].
另外,${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
这是错误的,因为lib libaes.a
与go 文件的位置相同。
然后我改了一下,通过了。