【问题标题】:Build Go bindings for multiple library versions?为多个库版本构建 Go 绑定?
【发布时间】:2026-01-20 14:10:01
【问题描述】:

我在尝试将pond 使用的go-gtk fork 中的GTK3 支持与基于GTK2 的上游go-gtk 合并时遇到了一个小的hiccup

这些指定 GTK 版本的 cgo pkg-config 行必须 afaik 出现在每个文件中,这样可以防止 GTK 2 和 3 共有的绑定存在于一个公共文件中。

我想构建针对多个 GTK 版本编译文件的“惯用”技巧是:将公共代码放在 foo_common.go 文件中,这样它就永远不会构建。使用perlbash + sed 脚本从foo_common.go 构建foo2.gofoo3.go,方法是修复cgo pkg-config 行并为gtk2 标签添加go build 指令。

【问题讨论】:

    标签: go preprocessor gtk3 gtk2


    【解决方案1】:

    您可以使用build constrain aka 标签来实现。

    首先您必须拆分使用 gtk2 和 gtk3 的文件,然后假设您希望 gtk3 成为默认值(如果您将 gtk2 设为默认值,我会皱眉):

    gtk3.go:

    // +build !gtk2
    
    package main
    
    import "fmt"
    
    func main() {
        fmt.Println("gtk3")
    }
    

    gtk2.go:

    // +build gtk2
    
    package main
    
    import "fmt"
    
    func main() {
        fmt.Println("gtk2")
    }
    

    然后进行测试:

    $ go build; and ./constrains
    gtk3
    $ go build -tags gtk2; and ./constrains
    gtk2
    

    【讨论】:

    • 没有。构建标签是不够的,因为cgo pkg-config 行必须出现在 every 文件中。您可以将构建标签与 cpp 或 perl 等预处理器一起使用,就像我在问题中描述的那样。
    • 是的,我当然同意 gtk3 是默认设置,不知道为什么有人甚至在这一点上费心构建对 gtk2 的支持,也许它的占用空间更小或其他什么。