为多个库版本构建 Go 绑定?

Posted

技术标签:

【中文标题】为多个库版本构建 Go 绑定?【英文标题】:Build Go bindings for multiple library versions? 【发布时间】:2015-03-06 14:49:54 【问题描述】:

我在尝试将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 指令。

【问题讨论】:

【参考方案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 的支持,也许它的占用空间更小或其他什么。

以上是关于为多个库版本构建 Go 绑定?的主要内容,如果未能解决你的问题,请参考以下文章

opencv绑定ios

Go语言的GUI方案,与Qt和QML都能绑定,也有从头写的gxui

Xamarin - 错误构建绑定库 Messaging.g.cs

2023-02-28:moonfdd/ffmpeg-go是用go语言绑定ffmpeg的库,目前是github上最好用的库。请用go语言将yuv文件编码为h264文件。

用 Go 编写的音频库?

使用Go语言来理解Tensorflow