2013-02-04 28 views
3

我嘗試用CGO如何在golang中包裝zlib?

調用從golang的C zlib的修復golang最慢的壓縮實現,但我得到一個錯誤

錯誤:「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 
} 
+2

請添加:a)您對上述源使用哪個命令(完整)b)上述源位於何處是「zlib.h」所在的位置。 – zzzz

+0

a)我只使用go run cgotest.go b)上面的源位於/ Volumes/MacintoshHD/Users/dawn/Documents/workspace/work/dev/sandbox/testgo/src/cgotest c)zlib.h can被發現在很多地方,我改變了包括到 #include「/opt/local/include/zlib.h」 但仍然是相同的問題 你可以在你的電腦上編譯這個嗎? – davyzhang

+0

嘗試了一段時間無濟於事。谷歌搜索也沒有幫助,既不: - ( – zzzz

回答

6

這是您的代碼的固定版本。請注意0​​與zlib庫和小C函數myDeflateInit鏈接,它處理的事實是deflateInit是一個宏而不是函數。還請注意strm的定義更改。不幸的是 - 我想不出比C小墊片函數更好的方法。

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) 
} 
+0

哦,golang/cgo不把宏對待,我明白了!非常感謝固定版本幫助我這麼多! – davyzhang