2013-05-10 4 views
1

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

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

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

+0

Помогает ли [это] (https://github.com/AllenDang/w32)? Он не использует cgo, но вместо этого делает это: 'syscall.NewLazyDLL (« ole32.dll »)'. Это полезно, поскольку он может быть легко скомпилирован (я не использую Windows, поэтому это большой плюс). Я не знаю, будет ли это работать для вашей библиотеки. – tjameson

+0

@tjameson Я обязательно получу этот хороший обзор сегодня или завтра. Благодаря! – Lander

ответ

1

К сожалению, у меня нет оконной машины, чтобы попробовать это самостоятельно, но теоретически, это должно работать. Шаги, которые я перечисл, написаны с перспективой 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.

+0

Дело в том, что на самом деле есть привязка C для приложения, и это то, что использовал оригинальный человек, который написал библиотеку, которую я модифицирую. [Здесь] (https://github.com/wtolson/go-taglib) - это проект. Основание на Windows просто превращается в общую суку. Несмотря на то, что я создал библиотеку, теперь у меня проблемы с mingw, и я просто решил передать Windows пальцем. Спасибо за помощь. – Lander