为多个库版本构建 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
文件中,这样它就永远不会构建。使用perl
或bash + sed
脚本从foo_common.go
构建foo2.go
和foo3.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 绑定?的主要内容,如果未能解决你的问题,请参考以下文章
Go语言的GUI方案,与Qt和QML都能绑定,也有从头写的gxui
Xamarin - 错误构建绑定库 Messaging.g.cs
2023-02-28:moonfdd/ffmpeg-go是用go语言绑定ffmpeg的库,目前是github上最好用的库。请用go语言将yuv文件编码为h264文件。