Как импортировать и использовать реализацию CGO Brotli из Google?
Я пытаюсь импортировать и использовать cbrotli
реализация от Google, как показано ниже:
import (
"fmt"
"io/ioutil"
cbrotli "github.com/google/brotli/go/cbrotli"
)
Но я получаю следующую ошибку при попытке запустить программу:
learn-go [master●●] % CGO_CFLAGS="-I /dev/projects/go/learn-go/src/brotli/c/include/brotli" go run cmd/compress/main.go
# github.com/google/brotli/go/cbrotli
src/github.com/google/brotli/go/cbrotli/reader.go:13:10: fatal error: 'brotli/decode.h' file not found
#include <brotli/decode.h>
Я не уверен, как передать некоторые флаги C, чтобы убедиться, что я могу использовать реализацию brotli
3 ответа
Предполагая, что вы уже построили brotli
Если нет, то есть инструкции по установке на их странице Github:
$ mkdir out && cd out
$ ../configure-cmake
$ make
$ make test
$ make install
При создании приложения Go вам нужно только пройти -I ~<prefix>/include
, где <prefix>
где вы установили заголовочные файлы для brotli
, Если вы не настроили этот префикс, он обычно находится в /usr/local
,
После этого вы можете запустить с помощью:
$ CGO_FLAGS='-I <prefix>/include' CGO_FLAGS='-L <prefix>/lib' LD_LIBRARY_PATH='<prefix>/lib' go run cmd/compress/main.go
Примечание: вам не нужно добавлять "brotli" в конце вашего CGO_FLAGS
При установке на macos вы можете использовать brew (см. Формулы для версии).
brew install brotli
# Copy the symlinks from brew prefix dir into /usr/local
sudo cp -r $(brew --prefix)/include/brotli /usr/local/include/.
sudo cp -r $(brew --prefix)/lib/libbrotli* /usr/local/lib/.
# Compiler will check /usr/local by default.
CGO_ENABLED=1 go build ...
Также доступна реализация Go:
package main
import (
"github.com/andybalholm/brotli"
"net/http"
)
const in = "https://raw.githubusercontent.com" +
"/google/brotli/master/tests/testdata/ukkonooa.compressed"
const out = "ukko nooa, ukko nooa oli kunnon mies, kun han meni saunaan, " +
"pisti laukun naulaan, ukko nooa, ukko nooa oli kunnon mies."
func main() {
g, e := http.Get(in)
if e != nil {
panic(e)
}
defer g.Body.Close()
b := make([]byte, len(out))
brotli.NewReader(g.Body).Read(b)
println(string(b) == out)
}