Использование библиотек Windows с cgo

Я пытаюсь создать пакет Go, который использует TagLib, и у меня возникли небольшие проблемы с определением как именно использовать скомпилированные библиотеки с cgo.

Я скомпилировал TagLib, который выдал tag.dll, tag.exp и tag.lib в каталоге taglib. В каталоге привязок также были двоичные файлы taglib_c.*, но я предполагаю, что просто игнорирую их.

Как мне использовать скомпилированные библиотеки для использования с Go? У меня все настроено в исходном коде из проекта на OS X, но что мне нужно сделать, чтобы он скомпилировался на Windows? Должна ли скомпилированная библиотека (dll или статическая библиотека?) находиться в том же каталоге, что и источник? А заголовки?


person Lander    schedule 10.05.2013    source источник
comment
Помогает ли это? Он не использует cgo, а вместо этого делает следующее: syscall.NewLazyDLL("ole32.dll"). Это полезно, так как его можно легко кросс-компилировать (я не использую Windows, так что это большой плюс). Я не знаю, будет ли это работать для вашей библиотеки.   -  person beatgammit    schedule 14.05.2013
comment
@tjameson Я обязательно посмотрю это сегодня вечером или завтра. Спасибо!   -  person Lander    schedule 15.05.2013


Ответы (1)


К сожалению, у меня нет машины с Windows, чтобы попробовать это самому, но теоретически это должно работать. Шаги, которые я перечислил, написаны с точки зрения Unix, но их следует напрямую переводить в Windows, если не указано иное. Для Windows мне нравится использовать GitBash для моего терминала, поскольку он поставляется с некоторыми полезными инструментами Unix.

В любом случае, я собираюсь проработать весь процесс, чтобы убедиться, что я не делаю никаких предположений. во-первых, мы начнем со скачивания и установки taglib. Предполагая, что вы загрузили имеющийся у них архив 1.8, тогда Я бы установил его локально в какую-нибудь папку на моем компьютере:

/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 build в исходном каталоге Go.

Возможные проблемы:

Таким образом, некоторые проблемы, с которыми вы можете столкнуться, - это узнать, что у вас нет необходимых библиотек для сборки taglib в Windows, хотя похоже, что вы уже создали ее, так что это должно быть хорошо. Вы заметите, что в исходниках go я добавил LDFLAG для стандартной библиотеки C++. Это потому, что taglib использует C++. Если это окажется проблемой, я бы создал простую программу на C вместе с вашим кодом go, которая взаимодействует с библиотекой C++ и создает для нее интерфейс C. По моему опыту, гораздо проще работать с библиотекой C и Go, чем с C++ и Go.

person noj    schedule 11.05.2013
comment
Дело в том, что на самом деле для приложения существует привязка C, которую использовал первоначальный человек, написавший библиотеку, которую я модифицирую. Вот проект. Построение на Windows просто оказалось полной сукой. Несмотря на то, что я создал библиотеку, теперь у меня проблемы с mingw, и я просто решил показать Windows. Спасибо за помощь. - person Lander; 11.05.2013