如何在golang中使用LDFLAGS的相对路径

Posted

技术标签:

【中文标题】如何在golang中使用LDFLAGS的相对路径【英文标题】:How to use a relative path for LDFLAGS in golang 【发布时间】:2015-03-18 05:42:06 【问题描述】:

我正在尝试构建一个使用静态库(.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 中使用相对路径? ,这样我就可以在任何路径中构建项目。

【问题讨论】:

【参考方案1】:

你目前不能。目录在构建命令和链接之间发生变化。现在,您要么需要链接到绝对路径,要么使用 CGO_LDFLAGS 环境变量。

在 go1.4 之后有一个提交,它添加了一个 $SRCDIR 变量,该变量在构建时替换为包含源文件的目录的绝对路径。 https://github.com/golang/go/issues/7891。这将在 go1.5 中,您现在可以通过从源代码构建 Go 轻松使用它。

【讨论】:

知道了!谢谢您的解释! 从 go1.5.4 开始,#cgo LDFLAGS: -L$SRCDIR/testserver -ltest 工作正常。【参考方案2】:

$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

这是错误的,因为 lib libaes.a 与 go 文件的位置相同。 然后我改了,通过了。

【讨论】:

以上是关于如何在golang中使用LDFLAGS的相对路径的主要内容,如果未能解决你的问题,请参考以下文章

使用 -ldflags -H=windowsgui 编译 golang 应用程序时将输出打印到命令窗口

Golang -ldflags 的一个技巧

golang 引用相对路径package

golang文件相对路径问题

Makefile选项CFLAGS,LDFLAGS,LIBS

Makefile选项CFLAGS,LDFLAGS,LIBS