К сожалению, у меня нет машины с 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
syscall.NewLazyDLL("ole32.dll")
. Это полезно, так как его можно легко кросс-компилировать (я не использую Windows, так что это большой плюс). Я не знаю, будет ли это работать для вашей библиотеки. - person beatgammit   schedule 14.05.2013