我正在尝试构建一个使用TagLib的Go包,而且我在确定如何使用cgo编译库时遇到了一些麻烦。
我编译了TagLib,它在tag.dll
目录中吐出tag.exp
,tag.lib
和taglib
。绑定目录中还有taglib_c.*
个二进制文件,但我假设我只是忽略它们。
如何使用已编译的库与Go一起使用?我在OS X上的项目源代码中设置了所有内容,但是我需要做些什么才能在Windows上进行编译?编译的库(dll或静态库?)是否必须与源位于同一目录中?标题怎么样?
答案 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
文件夹中进行开发。如果您查看文件夹内部,您会找到bin
,lib
和include
的子目录。
所以这是时髦的部分。 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要容易得多。