как я могу завернуть zlib в голанг?
Я попытался исправить самую медленную реализацию zip в golang, вызвав c zlib из golang с помощью cgo
Но я получаю ошибку
Ошибка: 'deflateInit' undeclared (первое использование в этой функции)
DeflateInit определяется в zlib.h
Я что-то упустил? спасибо за любые подсказки.
package main
/*
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include "zlib.h"
*/
import "C"
import (
"fmt"
)
func main() {
fmt.Println("hmmm....")
fmt.Println(int(C.random()))
var strm C.struct_z_stream
fmt.Println(strm)
ret := C.deflateInit(&strm, 5) // trouble here
}
1 ответ:
Вот исправленная версия вашего кода. Обратите внимание на
#cgo LDFLAGS: -lz
, чтобы связать с библиотекой zlib и маленькой функцией CmyDeflateInit
, которая имеет дело с тем фактом, чтоdeflateInit
является макросом, а не функцией. Обратите также внимание на изменение определенияstrm
.Макросы C довольно раздражают, чтобы иметь дело с Go к сожалению-я не мог придумать лучшего способа, чем небольшая функция c shim.
package main /* #cgo LDFLAGS: -lz #include <stdlib.h> #include <stdio.h> #include <string.h> #include <assert.h> #include "zlib.h" int myDeflateInit(z_streamp s, int n) { return deflateInit(s, n); } */ import "C" import ( "fmt" ) func main() { fmt.Println("hmmm....") fmt.Println(int(C.random())) var strm C.z_stream fmt.Println(strm) ret := C.myDeflateInit(&strm, 5) fmt.Println(ret) }