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

#windows #go #dll #hunspell

# #Windows #Вперед #dll #hunspell

Вопрос:

Я пытаюсь использовать библиотеку hunspell в проекте Go в Windows.

У меня есть скомпилированная библиотека DLL Windows (x64) и соответствующий файл заголовка (который написан на C), но я не могу связать его с программой Go.

Что я пробовал до сих пор:

 package main

//#cgo CFLAGS: -Id:/Go/HunSpellTest/build/
//#cgo LDFLAGS: -Ld:/Go/HunSpellTest/build/llibhunspell-1.7-0.dll  -llibhunspell-1.7-0

// #include <stdlib.h>
// #include <hunspell.h>
import "C"

import (
    "unsafe"
)

func main() {
    C.Hunspell_create()
}
 

Но с любой комбинацией путей и имен файлов (с расширением, без расширения, без номера версии, с относительным и абсолютным путем, с использованием косой или обратной косой черты) Я получил ту же ошибку:

undefined reference to __imp_Hunspell_create

Я пытался добавить этот путь к глобальной PATH переменной или поместить библиотеки DLL в общесистемную папку, но ничего не получалось.

Пожалуйста, обратите внимание, что я могу связать библиотеку DLL с syscall пакетом и вызвать Hunspell_create метод, но я хотел бы использовать библиотеку, как в пакете hunspellgo.

Комментарии:


1. тебя бы это устроило? pkg.go.dev/golang.org/x/ sys/ windows#NewLazyDLL

2. @StevenPenny: Нет, я могу включить DLL через пакет системного вызова, но я хотел бы использовать его с cgo.

3. достаточно справедливо — но имейте в виду syscall , что пакет устарел

Ответ №1:

C.Hunspell_create() отсутствуют const char* affpath const char* dpath параметры и.

Возможно, вам также не хватает некоторых mingw-w64/msys2/cygwin пакетов deps в Windows. похоже, что hunspellgo не тестировался в Windows. Для компиляции hunspell в Windows вам нужна linux-подобная система сборки (например, mingw-w64/msys2/cygwin ). Смотрите на https://github.com/hunspell/hunspell#compiling-on-windows . Golang с поддержкой cgo в Windows также нуждается в некоторых gcc/g deps.

Комментарии:

1. Я знаю, что в нем отсутствуют его параметры, но это не проблема. Проблема в том, что компилятор не может найти сам метод. У меня установлен mingw-w64, но я не хочу компилировать сам пакет hunspell в Windows, я хотел бы использовать предварительно скомпилированную DLL.

2. Вам нужно dlltool -dllname hunspell.dll --def hunspell.def --output-lib libhunspell.a . В gcc / g не использует hunspell.dll или hunspell.lib в качестве файла библиотеки.

3. @Fenistil Вы можете syscall использовать DLL-файл в Windows. Но с CGO для этого нужен lib{name}.a файл. Сначала вы должны сгенерировать ее. undefined reference to __imp_Hunspell_create означает, что у вас отсутствует libhunspell.a файл. см. cygwin.com/cygwin-ug-net/dll.html .

4. Спасибо, я попробую это и отвечу

5. @Fenistil может быть, вы можете использовать это напрямую: github.com/mlt/hunspell/releases/download/tst /…