Ошибки компоновщика при кросс-компиляции cgo в Windows с помощью mingw32

# #mingw-w64 #cgo

#mingw-w64 #cgo

Вопрос:

Я работаю над небольшой службой Cgo. Мы нацелены на развертывание Linux, но я хочу иметь исполняемый файл Windows для локального тестирования. Сборка Linux завершается и выполняется, но при кросс-компиляции Windows возникают некоторые ошибки компоновщика, которые я не понимаю. Мне бы не помешали некоторые подсказки о том, как двигаться дальше от этого:

 CC=x86_64-w64-mingw32-gcc CGO_ENABLED=1 GOOS=windows GOARCH=amd64 go build -o target/dist/windows-amd64 # voltagems/voltagefuncs /usr/bin/x86_64-w64-mingw32-ld: $WORK/b122/_x002.o: in function `_cgo_88b59ed285ae_Cfunc_VeCreateFPE': /tmp/go-build/cgo-gcc-prolog:55: undefined reference to `__imp_VeCreateFPE' /usr/bin/x86_64-w64-mingw32-ld: $WORK/b122/_x002.o: in function `_cgo_88b59ed285ae_Cfunc_VeCreateLibCtx': /tmp/go-build/cgo-gcc-prolog:75: undefined reference to `__imp_VeCreateLibCtx' /usr/bin/x86_64-w64-mingw32-ld: $WORK/b122/_x002.o: in function `_cgo_88b59ed285ae_Cmacro_VeFPEParamsDefaults': /tmp/go-build/cgo-gcc-prolog:92: undefined reference to `__imp_VeFPEParamsDefaults_v3' /usr/bin/x86_64-w64-mingw32-ld: $WORK/b122/_x002.o: in function `_cgo_88b59ed285ae_Cfunc_VeGetErrorDetails': /tmp/go-build/cgo-gcc-prolog:110: undefined reference to `__imp_VeGetErrorDetails' /usr/bin/x86_64-w64-mingw32-ld: $WORK/b122/_x002.o: in function `_cgo_88b59ed285ae_Cfunc_VeGetVersion': /tmp/go-build/cgo-gcc-prolog:127: undefined reference to `__imp_VeGetVersion' /usr/bin/x86_64-w64-mingw32-ld: $WORK/b122/_x002.o: in function `_cgo_88b59ed285ae_Cmacro_VeLibCtxParamsDefaults': /tmp/go-build/cgo-gcc-prolog:144: undefined reference to `__imp_VeLibCtxParamsDefaults_v3' /usr/bin/x86_64-w64-mingw32-ld: $WORK/b122/_x002.o: in function `_cgo_88b59ed285ae_Cfunc_VeProtect': /tmp/go-build/cgo-gcc-prolog:164: undefined reference to `__imp_VeProtect' collect2: error: ld returned 1 exit status make: *** [Makefile:3: build] Error 2  

Некоторые из этих символов несколько знакомы. «VeProtect» и аналогичные функции предоставляются библиотекой, с которой я связываюсь, и все эти функции вызываются из моего модуля cgo.

Обновить:

Если это поможет, вот верхняя часть заголовка cgo из одного исходного файла cgo:

 /* #cgo CFLAGS: -g -Wall -I${SRCDIR}/../include/v6.21.0 #cgo linux LDFLAGS: -L${SRCDIR}/../lib/linux/v6.21.0 -lvibesimple -lvibecrypto -lvibeictk -lvibeserver #cgo windows LDFLAGS: -L${SRCDIR}/../lib/windows/v6.21.0 -lvibesimple -lvibecrypto -lvibeictk -lvibeserver  

и ${SRCDIR}../lib/windows/v6.21.0 содержит эти файлы (обратите внимание, что исходный файл находится в одном подкаталоге ниже корневого каталога):

./ ssleay32.lib* vibelocaltest.lib* vibesimple.lib* ../ vibecrypto.lib* vibeserver.lib* libcurl_a.lib* vibeictk.lib* vibesimpledyn.dll* libeay32.lib* vibe.lib* vibesimpledyn.lib*

Обновить:

Я подумал, могу ли я просто просмотреть все символы в этих библиотеках в поисках «__imp_VeCreateFPE». Для этого я использовал «x86_64-w64-mingw32-nm», и я нашел этот символ в «vibesimpledyn.lib». Я не уверен, в чем заключается связь между «vibesimpledyn.lib» и «»vibesimpledyn.dll». Я добавил «-lvibesimpledyn» к флагам компоновщика (в дополнение к «-lvibesimple»), и это удалило все эти ошибки компоновщика, заменив их некоторыми, которые еще более озадачивают:

 voltagefuncs/voltagefuncs.go:109:37: cannot use _Ctype_ulong(_Ciconst_sizeof_char * len(data)) (type _Ctype_ulong) as type _Ctype_ulonglong in argument to _Cfunc__CMalloc voltagefuncs/voltagefuncs.go:127:32: cannot use _Ctype_ulong(_Ciconst_sizeof_char * BufSize) (type _Ctype_ulong) as type _Ctype_ulonglong in argument to _Cfunc__CMalloc  

Первая из упомянутых строк такова:

 plaintextBuffer := C.malloc(C.ulong(C.sizeof_char * len(data)))  

Просто, чтобы было ясно, версия Linux отлично компилируется и связывается, и выполняет эту строку без проблем.

На данный момент я не знаю, является ли это проблемой с библиотеками поставщиков, которые я использую, Cgo или mingw32.

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

1. Вы уверены, что пытаетесь установить связь с библиотеками для правильной платформы?

2. Я не вижу никаких доказательств этого. Я предоставлю дополнительную информацию о файле cgo и структуре каталогов.