2013-05-10 16 views
1

我試圖構建一個使用TagLib的Go包,並且我在確定如何使用cgo編譯的庫時遇到了一些問題。使用Windows庫與cgo

我已經編譯了TagLib,它已經在taglib dir中吐出了tag.dll,tag.exptag.lib。綁定目錄中還有taglib_c.*二進制文件,但我假設我只是忽略這些文件。

如何使用編譯的庫與Go一起使用?我在OS X上的項目的源代碼中安裝了所有東西,但是我需要做什麼才能使其在Windows上編譯?編譯過的庫(dll或靜態庫?)是否必須與源相同的目錄中?怎麼樣的頭文件?

+0

[this](https://github.com/AllenDang/w32)有幫助嗎?它不使用cgo,而是使用它:'syscall.NewLazyDLL(「ole32.dll」)'。這很有用,因爲它可以輕鬆交叉編譯(我不使用Windows,所以這是一個主要優點)。但我不知道這是否會對您的圖書館有效。 – tjameson 2013-05-14 16:51:01

+0

@tjameson我肯定會在今晚或明天給你一個好看的。謝謝! – Lander 2013-05-14 22:39:56

回答

1

不幸的是,我沒有一臺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 

上面的代碼應的文件夾/home/noj/clibs爲發展本地安裝的taglib。如果您查看文件夾內部,可以找到bin,libinclude的子目錄。

所以這裏是時髦的部分。 Windows標準是將動態lib文件(*.dll)轉儲到bin目錄中。一些開源庫遵守這一點,並做到這一點,其他人仍然將*.dll文件轉儲到lib目錄中,因爲這是他們通常在Unix系統中進行的。您需要查看安裝時生成的lib目錄,並將生成的所有*.dll文件複製到bin目錄中,以確保正確鏈接的發生沒有過多的嘲諷。

現在就去找源碼吧!在源代碼頂部,您需要包含cgo元註釋,以告訴Go搜索所需庫的位置以及它們的頭文件(安裝期間生成的include目錄)。下面是嘗試使用上面我們剛剛建好的庫的一些圍棋來源:

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 build圍棋的源目錄中的代碼。

可能出現的問題:

所以,你可能會遇到是查不到的,你不必在Windows中建立的taglib必要的庫,儘管它聽起來像你已經建立了它的一些問題,所以那應該沒問題。您會注意到,在源代碼中,我爲標準C++庫添加了LDFLAG。這是因爲taglib使用C++。如果事實證明這是一個問題,我會創建一個簡單的C程序以及與C++庫交互的代碼,併爲它創建一個C接口。根據我的經驗,使用C庫和Go比使用C++和Go更容易。

+0

事情是,實際上有一個應用程序的C綁定,這就是我正在修改使用的庫的原始人。 [這裏](https://github.com/wtolson/go-taglib)就是這個項目。在Windows上構建只是一個整體婊子。儘管我建立了圖書館,但現在我遇到了與mingw有關的問題,並決定給Windows提供手指。感謝您的幫助。 – Lander 2013-05-11 04:08:39