Кросс-компиляция golang с целью cgo для Windows на хосте macOS

Я использую macOS и пытаюсь выполнить кросс-компиляцию исполняемого файла golang (CGO 1.10) для Windows с помощью mingw-w64, установленного из homebrew.

У меня есть пакет golang только с одной функцией (SimpleQRDecode), которая вызывает другую функцию из моего источника c ++ (FindAndDecodeQR, использует порт zxing c ++).

  1. Компиляция исходников ZXing в порядке (x86_64-w64-mingw32-g ++)
  2. Компиляция qrcode.cpp в порядке (x86_64-w64-mingw32-g ++)
  3. Успешно слил все объекты (zxing + my) в статическую библиотеку (x86_64-w64-mingw32-ar)
  4. Успешно вызвал ranlib в статической библиотеке (x86_64-w64-mingw32-ranlib)
  5. НЕ УДАЛОСЬ звонить CGO_ENABLED=1 CXX="x86_64-w64-mingw32-g++" CXX_FOR_TARGET="x86_64-w64-mingw32-g++" CC="x86_64-w64-mingw32-gcc" CC_FOR_TARGET="x86_64-w64-mingw32-gcc" GOOS=windows GOARCH=amd64 go build -x

go build вывод состоит из множества неразрешенных символьных сообщений, таких как

libmyqr.a(qrcode.o):qrcode.cpp:(.text+0x79): undefined reference to `operator new(unsigned long long)'
libmyqr.a(qrcode.o):qrcode.cpp:(.text+0x2cb): undefined reference to `std::string::length() const'
libmyqr.a(qrcode.o):qrcode.cpp:(.text+0x4a7): undefined reference to `__cxa_begin_catch'
libmyqr.a(BinaryBitmap.cpp.obj):BinaryBitmap.cpp:(.text+0x5c2): undefined reference to `std::ios_base::Init::~Init()'
libmyqr.a(BinaryBitmap.cpp.obj):BinaryBitmap.cpp:(.xdata+0xc): undefined reference to `__gxx_personality_seh0'

qrcode.go:

package qrcode

/*
#cgo CFLAGS: -I../../native/prefix/include -I../../libmyqr -fPIC
#cgo CXXFLAGS: -I../../native/prefix/include -I../../libmyqr -fPIC
#cgo LDFLAGS: -L../../libmyqr -lmyqr -lstdc++
#include <stdlib.h>
#include <qrcode.h>
*/
import "C"
import (
"errors""fmt""unsafe")

func SimpleQRDecode(rasterData []byte, width, height int) (string, bool, error) {
res := C.FindAndDecodeQR((*C.char)(unsafe.Pointer(&data[0])), C.int(len(data)), C.int(width), C.int(height))

qrcode.h:

#ifdef __cplusplus
extern "C" {
#endif

const char* FindAndDecodeQR(char *raster, int size, int width, int height);#ifdef __cplusplus
}
#endif

qrcode.cpp:

#include "qrcode.h"
#include <sstream>

#include <zxing/ZXing.h>
#include <zxing/Binarizer.h>
#include <zxing/BinaryBitmap.h>
#include <zxing/Result.h>
#include <zxing/qrcode/QRCodeReader.h>
#include <zxing/common/GreyscaleRotatedLuminanceSource.h>
#include <zxing/common/GlobalHistogramBinarizer.h>

const char* FindAndDecodeQR(char *raster, int size, int width, int height) {
// GreyscaleLuminanceSource

std::ostringstream resStream;

try {
zxing::ArrayRef<char> image(raster, size);
zxing::Ref<zxing::GreyscaleRotatedLuminanceSource> source(new zxing::GreyscaleRotatedLuminanceSource(image, width, height, 0, 0, width, height));

libmyqr.a — статическая библиотека из всех скомпилированных объектов zxing + qrcode.cpp.o

2

Решение

Вероятно, это не то, что вы хотите услышать, но самый простой способ кросс-компиляции в Windows на Mac — это создать библиотеку DLL из вашего c/c++ код и обрабатывать эту библиотеку DLL из вашего go код. В этой ситуации вам даже не нужно CGO_ENABLED=1,

go код может выглядеть так (не проверено):

// +build windows

package qrcode

import (
"errors""fmt""syscalls""unsafe")

var modYourPkg = syscall.NewLazyDLL("yourpkg.dll")

var procFindAndDecodeQR = modYourPkg.NewProc("FindAndDecodeQR")

func SimpleQRDecode(rasterData []byte, width, height int) (string, bool, error) {
res, _, _ := procFindAndDecodeQR.Call(
uintptr(unsafe.Pointer(&rasterData[0])),
uintptr(len(data)),
uintptr(width),
uintptr(height),
)
...
}

Смотрите больше в документации к пакету syscall.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector