3

我试图通过使用 cgo 从 golang 调用 c zlib 来修复 golang 最慢的 zip 实现

但我得到一个错误

错误:“deflateInit”未声明(在此函数中首次使用)

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
}
4

1 回答 1

7

这是您的代码的固定版本。请注意#cgo LDFLAGS: -lz与 zlib 库和小 C 函数的链接,该函数处理宏而不是函数myDeflateInit这一事实。deflateInit还要注意定义的变化strm

不幸的是,从 Go 中处理 C 宏相当烦人——我想不出比一个小的 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)
}
于 2013-02-04T19:05:56.680 回答