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

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

 

工作項目原因,需要對golang進行升級。升級之後老的iconv-go運行有問題。因為新的golang運行更加嚴格,所以需要升級iconv-go.

從djimenez/iconv-go 拉下來代碼進行編譯發現“找不到iconv庫的一些介面”,目測是庫沒鏈進來。錯誤資訊如下:

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庫?

iconv --versioniconv (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發現

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 gosize_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);}*/

我了個去,darwin,freebsd,windows都有。但是我在centos下使用的。難不成是這個原因,導致iconv庫沒有鏈進去?於是嘗試進行了修改。

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 gosize_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);}*/

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

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

如果哪位同仁看到這篇文章,覺得不是這樣解決的,請不吝賜教。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.