К сожалению, у меня нет оконной машины, чтобы попробовать это самостоятельно, но теоретически, это должно работать. Шаги, которые я перечисл, написаны с перспективой 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 build
в исходном каталоге The Go в.
Возможные проблемы:
Так что некоторые проблемы, которые вы можете столкнуться, обнаруживает, что у вас нет необходимых библиотек для создания TagLib в Windows, хотя это звучит, как вы уже построили ее, так это должно быть хорошо. Вы заметите, что в исходном источнике я добавил LDFLAG
для стандартной библиотеки C++. Это связано с тем, что taglib использует C++. Если это окажется проблемой, я бы создал простую программу на языке C вместе с вашим кодеком, который взаимодействует с библиотекой C++ и создает для него интерфейс C. По моему опыту, гораздо проще работать с библиотекой C и Go, чем с C++ и Go.
Помогает ли [это] (https://github.com/AllenDang/w32)? Он не использует cgo, но вместо этого делает это: 'syscall.NewLazyDLL (« ole32.dll »)'. Это полезно, поскольку он может быть легко скомпилирован (я не использую Windows, поэтому это большой плюс). Я не знаю, будет ли это работать для вашей библиотеки. – tjameson
@tjameson Я обязательно получу этот хороший обзор сегодня или завтра. Благодаря! – Lander