3

我正在尝试构建一个使用TagLib的 Go 包,但在弄清楚如何将编译后的库与 cgo 一起使用时遇到了一些麻烦。

我已经编译了 TagLib,它吐出了tag.dll, tag.exp, 和tag.libtaglib目录中。在 bindings 目录中也有taglib_c.*二进制文件,但我假设我只是忽略了这些。

如何使用已编译的库与 Go 一起使用?我在 OS X 上的项目的源代码中设置了所有内容,但是我需要做什么才能使其在 Windows 上编译?编译后的库(dll 还是静态库?)是否必须与源代码位于同一目录中?标题呢?

4

1 回答 1

2

不幸的是,我自己没有可用的 Windows 机器来尝试这个,但从理论上讲,这应该可以工作。我列出的步骤是用 unix 视角编写的,但除非另有说明,否则它应该可以直接翻译到 Windows。对于 Windows,我喜欢在终端上使用GitBash,因为它带有一些有用的 unix 工具。

无论如何,我将完成整个过程,以确保我没有做出任何假设。首先,我们将从下载和安装 taglib 开始。假设您已经下载了他们可用的1.8 tarball,那么我会将其安装在本地计算机的某个文件夹中:

/home/noj $ mkdir -p clibs/src
/home/noj $ cd clibs/src
/home/noj/clibs/src $ tar -xvf /home/noj/Downloads/
/home/noj/clibs/src $ cd taglib-1.8
/home/noj/clibs/src/taglib-1.8 $ cmake -DCMAKE_INSTALL_PREFIX=/home/noj/clibs -DCMAKE_RELEASE_TYPE=Release .
/home/noj/clibs/src/taglib $ make
/home/noj/clibs/src/taglib $ make install

上面的代码应该在本地安装 taglib 用于开发文件夹中/home/noj/clibs。如果您查看文件夹的内部,您会发现binlib和的子目录include

所以这是时髦的部分。Windows 标准是将动态库文件 ( *.dll) 转储到bin目录中。一些开源库坚持这一点并做到这一点,其他人仍然将*.dll文件转储到lib目录中,因为这是它们通常在 Unix 系统中去的地方。您需要查看lib安装生成的目录并将生成的所有*.dll文件复制到该bin目录,以确保正确链接发生而没有太多的黑客行为。

现在获取源代码!在源代码的顶部,您需要包含cgo元注释以告诉 Go 在哪里搜索您想要的库,以及它们的标头(include安装期间生成的目录)。下面是一些尝试使用我们刚刚在上面构建的库的 Go 源代码:

package main

/*
#cgo LDFLAGS: -L/home/noj/clibs/lib -ltag -lstdc++
#cgo CFLAGS: -I/home/noj/clibs/include/taglib

#include <taglib.h>
*/
import "C"

import (
  // normal imports
  // ...
)

func main() {
  // ...
}

现在,Windows 还要求您将*.dll文件所在的目录添加到您的PATH.

/home/noj $ export PATH=$PATH:/home/noj/clibs/bin

现在我们应该准备好在go buildGo 的源目录中正常使用编译代码了。

可能的问题:

因此,您可能遇到的一些问题是发现您没有在 Windows 中构建 taglib 所需的库,尽管听起来您已经构建了它,所以应该没问题。您会注意到,在 go 源代码中,我添加了LDFLAG标准 c++ 库。这是因为 taglib 使用 C++。如果这被证明是一个问题,我将在您的 go 代码旁边创建一个简单的 C 程序,该程序与 c++ 库接口并为其创建一个 C 接口。根据我的经验,使用 C 库和 Go 比使用 C++ 和 Go 要容易得多。

于 2013-05-11T02:34:28.073 回答