Right libiconv version for Windows
最近在整合 libiconv,希望能夠解決一些跨平台[1]文字轉碼的問題。程式寫得很高興,結果移到 Windows 上一執行,卻不能執行,檢查的結果,是不支援 WCHAR_T,嘗試改轉成 UCS-2LE 或是 UTF-16LE,雖然可以轉,但有些字還是會爛掉。經過追查的結果發現,一切都是版本的問題。
對於曾經體驗過 GNU、Linux 以及其他 Open Source 軟體的好處的人來說,如果能夠也在 Windows 平台上,使用這些工具,那可真是一大樂事,多少能夠讓 Windows 變得稍微好用一些。因此,一直以來,這些 open source 軟體,不斷有官方或非官方的人或組織,在進行著 windows porting 的工作。大喀的有 Cygwin/MingGW,小喀的也有 UnxUtils 這類計畫存在[2]。而在 libiconv 的官方網站裡,也可以下載的到一個叫做 libiconv-1.9.1.bin.woe32.zip 的特別版本,將這個版本解開後,通常是放到 C:\usr 下,設定好 PATH 環境變數,即可使用。這正是原本我在 Windows 上使用的 libiconv 版本。
但今天卻發現,這個 1.9.1-woe32 的版本,compile/link 程式都沒有問題,但就是沒有 WCHAR_T,也會讓 UCS-2LE 或 UTF-16LE 的某些字爛掉。測了一下從 google 找到的幾個 libiconv for windows implementation,發現 GnuWin32 所提供的 libiconv,並沒有這個問題。換用了這個版本,跑一遍所有的 test case,這才很高興地確認,這一版,才是對的。
觀察了一下 GnuWin32,發現這是目前我所找到的,比較好的 GNU/OpenSource on Win32 的 solution。其一,皆是 native porting,不必像 Cygwin 那樣拖著一個大大的 unix emulation layer;其二,包裝的比較完整,除了各個 package 有 installer 之外,也皆按照 Windows 的習慣,統一安裝到 C:\Program Files\GnuWin32 目錄下,並形成完整的 UNIX 目錄結構,而且,對 DLLs 按右鍵看內容,也都有完整的版權與版本資訊。換句話說,GnuWin32「看起來」比較像個「正式的」GNU win32 solution。
所以,用這版的就對了啦!只可惜最後我還是找不到方法,在 compile-time、link-time 甚至在 run-time 檢查使用 libiconv 版本是否正確。不過,既然因為 LGPL 的限制,不好直接附在我們的軟體裡散佈,而必須另外安裝,也只有期待,使用我們的軟體的人,能夠乖乖地看說明書辦事了。



10 Comments
“觀察了一下 GnuWin32,發現這是目前我所找到的,比較好的 GNU/OpenSource on Win32 的 solution。其一,皆是 native porting,不必像 Cygwin 那樣拖著一個大大的 unix emulation layer”
非常同意,找iconv的win32库,跑到了gnuwin32上,下来看了下居然不是用cygwin的,非常不错。
配上 tcsh-win32 以及 vim-win32,基本上我已經可以在 win32 上用 unix 的方法做很多事情。
When I run the application compile and link with VC6, I got the error access violation.
Can you tell me why?
Thanks a lot.
When I run the applicaiton which is compiled ank linked using VC6, I got an error that access violation. Can you tell me why?
My application links to libiconv.lib. No error happens when compiling and linking.
Thanks a lot.
Dear Welbon Wang,
Usually, when there is access violation errors, it means there is something wrong with your pointers.
For example, when pointer
p(which point to a structure) isNULL,p-<fieldwill cause such kind of error.Jeff Hung
請問下載GnuWin32的libiconv安裝檔安裝好後需要再額外做什麼設定嗎?(我要使用VC++寫轉編碼程式)另外是下載有source還有沒有source的那一個setup檔?謝謝
Dear V,
你需要設定 project 的 include/library path,指到 %ProgramFiles%\GnuWin32\include 與 %ProgramFiles%\GnuWin32\lib 去。
沒有 source 的即可。
Jeff Hung
DEAR:
我用Cygwin + MSVC, 想使用 libiconv.lib 編譯, 但老是有問題... 想問 Makefile.am 應該如何改才對? 還煩請指教, THX!!
(1). library
$ ls -al libiconv*
-rwx------+ 1 Administrator SYSTEM 2992626 Mar 6 2008 libiconv-vc7.lib
-rwx------+ 1 Administrator SYSTEM 1343264 Jul 17 15:28 libiconv-vc7_debug.lib
-rwxr-x---+ 1 Administrator SYSTEM 1055158 May 31 2009 libiconv.a
-rwxr-x---+ 1 Administrator SYSTEM 8898 May 31 2009 libiconv.dll.a
-rwxr-x---+ 1 Administrator SYSTEM 916 May 31 2009 libiconv.la
-rwx------+ 1 Administrator SYSTEM 1020190 Mar 6 2008 libiconv.lib
(2). Makefile.am
include $(top_srcdir)/comlib.mk
SUBDIRS = .
INCLUDES = -I./include
lib_LTLIBRARIES = libXXCodeConv.la
#libXXCodeConv_la_LDFLAGS = $(no_undefined)
#libXXCodeConv_la_LDFLAGS = /usr/lib/iconv
#libXXCodeConv_la_LDFLAGS = $(no_undefined) /Zi -Wl,libiconv.lib,/LDd
libXXCodeConv_la_LDFLAGS = /usr/lib/libiconv.lib
(3). make
A. USE "libXXCodeConv_la_LDFLAGS = $(no_undefined)"
...
libtool: link: warning: undefined symbols not allowed in i686-pc-cygwin shared l
ibraries
B. USE "/ibXXCodeConv_la_LDFLAGS = $(no_undefined) /Zi -Wl,libiconv.lib,/LDd"
...
libiconv.lib
MSVCRT.lib(MSVCR71.dll) : error LNK2005: __errno 已經定義於 LIBCMT.lib(dosmap.obj)
MSVCRT.lib(MSVCR71.dll) : error LNK2005: _malloc 已經定義於 LIBCMT.lib(malloc.obj)
MSVCRT.lib(MSVCR71.dll) : error LNK2005: _free 已經定義於 LIBCMT.lib(free.obj)
MSVCRT.lib(MSVCR71.dll) : error LNK2005: _sprintf 已經定義於 LIBCMT.lib(sprintf.obj)
MSVCRT.lib(MSVCR71.dll) : warning LNK4006: __errno 已經定義於 LIBCMT.lib(dosmap.obj); 忽略第二個定義
MSVCRT.lib(MSVCR71.dll) : warning LNK4006: _malloc 已經定義於 LIBCMT.lib(malloc.obj); 忽略第二個定義
MSVCRT.lib(MSVCR71.dll) : warning LNK4006: _free 已經定義於 LIBCMT.lib(free.obj); 忽略第二個定義
MSVCRT.lib(MSVCR71.dll) : warning LNK4006: _sprintf 已經定義於 LIBCMT.lib(sprintf.obj); 忽略第二個定義
正在建立程式庫 .libs/libZk5CodeConv-0.lib 和物件 .libs/libZk5CodeConv-0.exp
LINK : warning LNK4098: 預設的程式庫 'MSVCRT' 與其他使用的程式庫衝突; 請使用 /NODEFAULTLIB:library
.libs/libZk5CodeConv-0.dll : fatal error LNK1169: 找到有一或多個已定義的符號
C. USE "libXXCodeConv_la_LDFLAGS = /usr/lib/libiconv.lib"
...
*** Warning: Trying to link with static lib archive /usr/lib/libiconv.lib.
*** I have the capability to make that library automatically link in when
*** you link to this library. But I can only do this if you have a
*** shared version of the library, which you do not appear to have
*** because the file extensions .lib of this argument makes me believe
*** that it is just a static archive that I should not use here.
libtool: link: warning: undefined symbols not allowed in i686-pc-cygwin shared l
ibraries
...
...
Microsoft (R) Library Manager Version 7.10.3077
Copyright (C) Microsoft Corporation. All rights reserved.
LIB : warning LNK4044: 無法辨認的選項 '/usr/lib/libiconv.lib'; 已忽略
LIB : warning LNK4044: 無法辨認的選項 '/usr/lib/libiconv.lib'; 已忽略
huggies,
看起來 libiconv.lib 裡面已經有一份 msvcrt.lib 了,你的程式也要連結 msvcrt.lib,導至有雙份標準函式庫實體。
建議你用 dll 與 libiconv 連結。
-- jeffhung
DEAR:
非常感謝您, 但是煩請您在教導一下... 請問 .lib 與 .a .la .dll .dll.a 有何不同? 如何改 Makefile.am 以達到"用 dll 與 libiconv 連結"? 而且應該用哪一個 libiconv (.a .la .lib....)? 還煩請您指導, THX!!
Post a Comment