iconv-go升級過程當中的編譯問題

 

工做項目緣由,須要對golang進行升級。升級以後老的iconv-go運行有問題。由於新的golang運行更加嚴格,因此須要升級iconv-go.html

從djimenez/iconv-go 拉下來代碼進行編譯發現「找不到iconv庫的一些接口」,目測是庫沒鏈進來。錯誤信息以下:git

go install ./...
# github.com/djimenez/iconv-go
/tmp/go-build579267556/github.com/djimenez/iconv-go/_obj/converter.cgo2.o: In function `_cgo_5f3e10abf205_Cfunc_iconv_open':
src/github.com/djimenez/iconv-go/converter.go:142: undefined reference to `libiconv_open'
/tmp/go-build579267556/github.com/djimenez/iconv-go/_obj/converter.cgo2.o: In function `_cgo_5f3e10abf205_Cfunc_iconv_close':
src/github.com/djimenez/iconv-go/converter.go:128: undefined reference to `libiconv_close'
/tmp/go-build579267556/github.com/djimenez/iconv-go/_obj/converter.cgo2.o: In function `_cgo_5f3e10abf205_C2func_iconv_open':
src/github.com/djimenez/iconv-go/converter.go:87: undefined reference to `libiconv_open'
/tmp/go-build579267556/github.com/djimenez/iconv-go/_obj/converter.cgo2.o: In function `_cgo_5f3e10abf205_C2func_iconv_close':
src/github.com/djimenez/iconv-go/converter.go:71: undefined reference to `libiconv_close'
/tmp/go-build579267556/github.com/djimenez/iconv-go/_obj/converter.cgo2.o: In function `call_iconv':
src/github.com/djimenez/iconv-go/converter.go:13: undefined reference to `libiconv'
collect2: ld returned 1 exit status

很奇怪,本地明明有安裝iconv,怎麼就找不到iconv庫?github

iconv --version
iconv (GNU libiconv 1.14)
Copyright (C) 2000-2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Written by Bruno Haible.

 

進到iconv-go的converter.go發現golang

package iconv

/*
#cgo darwin LDFLAGS: -liconv
#cgo freebsd LDFLAGS: -liconv
#cgo windows LDFLAGS: -liconv
#include <stdlib.h>
#include <iconv.h>

// As of GO 1.6 passing a pointer to Go pointer, will lead to panic
// Therofore we use this wrapper function, to avoid passing **char directly from go
size_t call_iconv(iconv_t ctx, char *in, size_t *size_in, char *out, size_t *size_out){
        return iconv(ctx, &in, size_in, &out, size_out);
}

*/

我了個去,darwinfreebsd,windows都有。可是我在centos下使用的。難不成是這個緣由,致使iconv庫沒有鏈進去?因而嘗試進行了修改。redis

package iconv

/*
#cgo darwin LDFLAGS: -liconv
#cgo freebsd LDFLAGS: -liconv
#cgo windows LDFLAGS: -liconv
#cgo LDFLAGS: -liconv
#include <stdlib.h>
#include <iconv.h>

// As of GO 1.6 passing a pointer to Go pointer, will lead to panic
// Therofore we use this wrapper function, to avoid passing **char directly from go
size_t call_iconv(iconv_t ctx, char *in, size_t *size_in, char *out, size_t *size_out){
        return iconv(ctx, &in, size_in, &out, size_out);
}

*/

再進行編譯。奇蹟般的經過了,經過了,經過了。。。windows

好吧,目前只是這樣猥瑣的解決的。這樣寫不知道會不會對跨平臺形成影響。先這樣解決吧。記錄一下。centos

若是哪位同仁看到這篇文章,以爲不是這樣解決的,請不吝賜教。app

相關文章
相關標籤/搜索