【问题标题】:Override an external package's cgo compiler and linker flags?覆盖外部包的 cgo 编译器和链接器标志?
【发布时间】:2015-04-26 22:20:15
【问题描述】:

假设我想使用一些很棒的 go 包。我可以通过以下方式包含它:

import "github.com/really-awesome/project/foobar"

在该项目的 foobar.go 文件中,它定义了一些 cgo 指令,例如:

#cgo windows CFLAGS: -I C:/some-path/Include
#cgo windows LDFLAGS: -L C:/some-path/Lib -lfoobar

但如果我在其他地方安装了 foobar C 依赖项,我真的需要这些行来说明:

#cgo windows CFLAGS: -I C:/different-path/Include
#cgo windows LDFLAGS: -L C:/different-path/Lib -lfoobar

有没有办法覆盖或胜过cgo 正在寻找这些依赖项的地方?现在我的解决方法是在运行go get ./... 之后手动编辑这两行,这将获取github.comreally-awesome/project/foobar 代码。

注意:我正在使用MinGw 编译器,尽管我怀疑这是否重要。

更新:

我尝试添加标志来构建无济于事:

go build -x -gcflags="-I C:/different/include -L C:/different-path/lib -lfoobar"
go build -x -ccflags="-I C:/different/include" -ldflags="-L C:/different-path/lib -lfoobar"

使用-x 参数,我看到了标志的打印输出,它们不包括我在命令行上设置的标志。也许外部 go 包顶部的 #cgo CFLAGS/LDFLAGS 语句压缩了我告诉它使用的内容......

【问题讨论】:

  • 使用godepnut 或类似工具提供软件包并在您的版本中编辑构建标志可能是最简单的,虽然有点令人难过。 (无论如何,这对供应商来说很常见,因此您只能在需要时进行升级。)可能您可以传递 Go env var CC=some_batchfile.bat (或 CXX= 如果正在调用 C++ 编译器)并在您的参数中替换该文件想要,但即使它有效,那也几乎太痛苦了。 (通过供应商,至少您的更改流程类似于其他人已经为依赖管理所做的流程。)
  • fork 项目,更改源代码,去获取 fork 的 repo :)

标签: go cgo


【解决方案1】:

您可以通过设置CGO_CPPFLAGSCGO_LDFLAGS 环境变量来做到这一点。

例如,在我的 MacBook 上,Homebrew 安装在 ~/.homebrew(而不是 /usr/local)中,所以当我尝试使用本机绑定的 go get 包时,他们找不到标头和库。

为了解决这个问题,我将这两行添加到我的 ~/.zshenv 文件中:

export CGO_CPPFLAGS="-I $BREW_HOME/include"
export CGO_LDFLAGS="-L $BREW_HOME/lib"

【讨论】:

    【解决方案2】:

    这是#cgo pkgconfig: foobar 担任的角色。如果库是这样编写的,它将从 foobar 的 pkgconfig 定义中选择正确的路径。

    我意识到这不是问题的直接答案,而且 pkgconfig 也不完全是本地 Windows 工具...我很想知道是否存在任何其他解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-19
      相关资源
      最近更新 更多