как я могу завернуть 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 3

1 ответ:

Вот исправленная версия вашего кода. Обратите внимание на #cgo LDFLAGS: -lz, чтобы связать с библиотекой zlib и маленькой функцией C myDeflateInit, которая имеет дело с тем фактом, что 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)
}