3

TagLibを利用する Go パッケージをビルドしようとしていますが、コンパイルされたライブラリを cgo で使用する方法を正確に理解するのに少し苦労しています。

tag.dll、、、tag.expおよびディレクトリに吐き出されたTagLibをコンパイルしましtag.libtaglib。bindings ディレクトリにもtaglib_c.*バイナリがありましたが、私はそれらを無視していると仮定しています。

コンパイルされたライブラリを Go で使用するにはどうすればよいですか? OS X のプロジェクトのソースですべてのセットアップを行いましたが、Windows でコンパイルするにはどうすればよいですか? コンパイルされたライブラリ (dll または静的ライブラリ?) は、ソースと同じディレクトリにある必要がありますか? ヘッダーはどうですか?

4

1 に答える 1

2

残念ながら、私はこれを自分で試すことができる Windows マシンを持っていませんが、理論的にはこれでうまくいくはずです。リストした手順は UNIX の観点から書かれていますが、特に断りのない限り、Windows に直接変換できるはずです。Windows の場合、いくつかの便利な UNIX ツールが付属しているため、端末にGitBashを使用するのが好きです。

とにかく、私は仮定をしていないことを確認するために、プロセス全体に取り組みます. まず、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ます。

ここがファンキーな部分です。*.dllWindows の標準では、動的 lib ファイル ( ) をbinディレクトリにダンプします。一部のオープン ソース ライブラリはこれに準拠して実行しますが、他のライブラリ*.dllはディレクトリにファイルをダンプしますlib。これは、通常、Unix システムでファイルが移動する場所だからです。インストールによって生成されたディレクトリを確認し、生成されたすべてのファイルをディレクトリにlibコピーして、あまりハッカーを使わずに適切なリンクが行われるようにする必要があります。*.dllbin

それではソースコードをどうぞ!ソース コードの先頭に、必要cgoなライブラリを検索する場所とそのヘッダー (includeインストール中に生成されるディレクトリ) を Go に指示するメタ コメントを含める必要があります。上で構築したばかりのライブラリを使用しようとする 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() {
  // ...
}

*.dll現在、Windows では、ファイルが存在するディレクトリを に追加する必要もありますPATH。そのため、先に進みます...

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

go buildこれで、Go のソース ディレクトリ内を使用して通常通りコードをコンパイルする準備が整いました。

考えられる問題:

そのため、Windows で taglib をビルドするために必要なライブラリがないことに遭遇する可能性がありますが、既にビルド済みのように思えますが、それで問題ないはずです。LDFLAGgo ソースに、標準の C++ ライブラリ用のを追加したことに気付くでしょう。これは、taglib が C++ を使用しているためです。これが問題であることが判明した場合、私はあなたの go コードと一緒に、c++ ライブラリーとインターフェースを取り、そのための C インターフェースを作成する単純な C プログラムを作成します。私の経験からすると、C++ と Go を使用するよりも、C ライブラリと Go を使用する方がはるかに簡単です。

于 2013-05-11T02:34:28.073 に答える