使用带有cgo的Windows库

时间:2013-05-10 23:21:15

标签: windows go cgo

我正在尝试构建一个使用TagLib的Go包,而且我在确定如何使用cgo编译库时遇到了一些麻烦。

我编译了TagLib,它在tag.dll目录中吐出tag.exptag.libtaglib。绑定目录中还有taglib_c.*个二进制文件,但我假设我只是忽略它们。

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

1 个答案:

答案 0 :(得分: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文件夹中进行开发。如果您查看文件夹内部,您会找到binlibinclude的子目录。

所以这是时髦的部分。 Windows标准是将动态lib文件(*.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的源目录中的go build来正常编译代码。

可能出现的问题:

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