Сборка библиотеки CGO в файл JS WASM - PullRequest
0 голосов
/ 01 марта 2019

Я хочу написать JS-скрипт с использованием библиотеки веб-сборки, собранной из Golang.Но мне нужно использовать библиотеку C и использовать ее через CGO.

Короче говоря, мой код выглядит так (просто пример загрузки библиотек C):

package main

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

func main() {
    println("Hello")
}

Но когда я хочу собрать еекак и в уроке с командой ниже, у меня ошибка.

Команда:

GOARCH=wasm GOOS=js go build -o lib.wasm test.go

Вывод:

can't load package: package main: build constraints exclude all Go files in [Project path]

Так что мой вопрос больше, если вообще возможно что-то построитьвот так.

Спасибо.

1 Ответ

0 голосов
/ 01 марта 2019

Это не сработает: GOARCH=wasm GOOS=js в основном заставляет компилятор Go генерировать wasm байт-код из источника Go. Чтобы записать это другими словами, код Go компилируетсяк байт-коду WASM и вызовам API WASM вместо машинного кода, специфичного для ЦП, и системных вызовов к конкретному ядру ОС.

С другой стороны, cgo - это способ ссылка скомпилированный код C с скомпилированным кодом Go.Чтобы скомпилировать программу, использующую cgo, набор инструментов go обращается к реальному компилятору C (gcc большую часть времени), который компилирует части C.

Скомпилированный код C и WASMБайт-коды существуют в разных вселенных и не знают друг о друге.Теоретически, компилятор C, такой как gcc, мог бы иметь резервную копию WASM - точно так же, как сейчас go - но IIRC это не тот случай, и бэкэнд WASM Go учат как-то обрабатывать такой случай.

В целом, наиболее типичным случаем использования cgo является взаимодействие с уже существующей библиотекой, написанной на C (или предоставление C-совместимого API), и большинство таких библиотек обычно делают глубокие предположения относительно среды, в которой они работают.run in - обычно это POSIX-совместимая ОС (с набором системных вызовов для обработки файловых и сокетных операций ввода-вывода и т. д.).

Следовательно, если вы находитесь в редкой ситуации, когда вам нужно связатьс «чистой» библиотекой C, которая выполняет чистую обработку данных и никак не взаимодействует с базовой ОС, возможно, можно взглянуть на транслятор исходного кода C-to-Go.

...