[编码]使用MinGW 编译 iconv 库

C/C++第三方开源库的介绍和相关讨论
头像
523066680
Administrator
Administrator
帖子: 340
注册时间: 2016年07月19日 12:14
拥有现金: 锁定
储蓄: 锁定
Has thanked: 30 times
Been thanked: 27 times
联系:

[编码]使用MinGW 编译 iconv 库

帖子 #1 523066680 » 2016年10月25日 11:27

编辑:523066680
于 Code-By.Org,转载请注明出处

GNU页面
http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz

已有的环境:msys2.0, mingw, GnuWin32工具集

解压后先别急着configure
先看看 README.woe32

Building requires the mingw or cygwin development environment (includes gcc).
I recommend to use the cygwin environment as the development environment
and mingw only as the target (runtime, deployment) environment.
For this, you need to install
- cygwin,
- the mingw runtime package, also from the cygwin site.

首先安装cygwin,
进入目录后执行 ./configure , 第一个问题

checking if gcc supports -fno-rtti -fno-exceptions... ./configure: line 7594: diff:
command not found

缺个diff.exe,用everything 搜索到 C:\Program Files (x86)\GnuWin32\bin 下面有一个,复制到 C:\cygwin64\bin,
先不急着执行./configure,单独执行diff.exe 提示缺少 libintl3.dll,将这个文件也复制过来,
再次执行diff.exe 提示缺少 libiconv2.dll,再复制,没问题了。
(如果你从别的地方获取diff,可能不需要依赖dll,也可能依赖别的库,用类似的方法配置齐全就是了)

执行 ./configure 没有出现明显问题

执行 make ,提示

./relocatable.c: In function 'libcharset_relocate':
<command-line>:0:12: error: expected expression before '/' token
./relocatable.c:423:37: note: in expansion of macro 'INSTALLDIR'
const char *orig_installdir = INSTALLDIR;
^~~~~~~~~~
make[2]: *** [Makefile:65: relocatable.lo] Error 1
make[2]: Leaving directory 'C:/Users/ViANG/Desktop/libiconv-1.14/libcharset/lib'
make[1]: *** [Makefile:34: all] Error 2
make[1]: Leaving directory 'C:/Users/ViANG/Desktop/libiconv-1.14/libcharset'
make: *** [Makefile:42: lib/localcharset.h] Error 2

好像是说这个 INSTALLDIR 的宏里面,包含了不可预料的表达式(在/之前),但是我也不知道怎么看INSTALLDIR的值,
用grep -R "INSTALLDIR" * 看了一下

build-aux/install-reloc: -D"INSTALLPREFIX=\"$prefix\"" -D"INSTALLDIR
=\"$installdir\"" \
lib/Makefile:-DENABLE_RELOCATABLE=1 -DIN_LIBRARY -DINSTALLDIR=\"$(libdir)\" -DNO
_XMALLOC \
lib/Makefile.in:-DENABLE_RELOCATABLE=1 -DIN_LIBRARY -DINSTALLDIR=\"$(libdir)\" -
DNO_XMALLOC \

大概是从某个参数中传递进去的,既然它的内容有毒,而且只有一处,那自己改写试试:
找到:libiconv-1.14\libcharset\lib\relocatable.c


const char *orig_installdir = INSTALLDIR;
改为
const char *orig_installdir = "/usr/local/cygwin";

同时 mkdir /usr/local/cygwin
然后执行
$ ./configure --prefix=/usr/local/cygwin
$ make
提示错误

C:\MinGW\bin\ranlib.exe: '/cygdrive/c/Users/name/Desktop/libiconv-1.14/lib/libcharset.a':
No such file

试了一下,对于mingw和msys的那一套,可以接受的路径是 /c/usr/...这样的,而在cygwin中的路径是 /cygdrive/c/usr...
试着用sed和grep 批量替换,以及寻找 生成路径的 cygpath命令,修改相应的参数,但还是失败了。

分割线

既然Cygwin 路径和 Msys mingw不兼容,而我对这一系列的东西不太熟,只能再换MSYS试试了
按cygwin的方法把diff.exe和相关的文件复制到 c:/mingw/bin

打开 MSYS2 Shell

$ ./configure
configure: error: cannot guess build type; you must specify one

添加参数:

$ ./configure --build=mingw32

看上去没什么问题

$ make

跑了一大段后,出现前面同样的问题:

./relocatable.c: In function 'libiconv_relocate':
<command-line>:0:12: error: 'C' undeclared (first use in this function)
./relocatable.c:423:37: note: in expansion of macro 'INSTALLDIR'
const char *orig_installdir = INSTALLDIR;
^~~~~~~~~~
<command-line>:0:12: note: each undeclared identifier is reported only once for
each function it appears in./relocatable.c:423:37: note: in expansion of macro 'INSTALLDIR'
const char *orig_installdir = INSTALLDIR;
^~~~~~~~~~
<command-line>:0:13: error: expected ',' or ';' before ':' token
./relocatable.c:423:37: note: in expansion of macro 'INSTALLDIR'
const char *orig_installdir = INSTALLDIR;
^~~~~~~~~~
make[1]: *** [Makefile:87: relocatable.lo] Error 1
make[1]: Leaving directory 'C:/Users/ViANG/Desktop/libiconv-1.14/lib'
make: *** [Makefile:33: all] Error 2


找到
libiconv-1.14/lib/relocatable.c 和
libiconv-1.14/libcharset/lib/relocatable.c
将const char *orig_installdir = INSTALLDIR 改为 const char *orig_installdir = "/usr/local" 继续,

$ make
$ make install

看上去没什么问题了 :coverface1

总结起来就是
  1. STRA='= \INSTALLDIR'
  2. STRB='= \"\/usr\/local\"'
  3.  
  4. ./configure --build=mingw32
  5.  
  6. sed -i "s/$STRA/$STRB/" `grep -rl -P "= \INSTALLDIR"`
  7. make
  8. make install

相关的库文件位于
\libiconv-1.14\lib\.libs

头文件位于
\libiconv-1.14\include

补充一个,网上找到的,预编译的库文件

编译好的64位库文件
https://github.com/holy-shit/iconv-for-windows

头像
523066680
Administrator
Administrator
帖子: 340
注册时间: 2016年07月19日 12:14
拥有现金: 锁定
储蓄: 锁定
Has thanked: 30 times
Been thanked: 27 times
联系:

编译iconv示例代码,utf8转gbk并输出

帖子 #2 523066680 » 2016年10月25日 18:01

不知道何年何月存了一份示例代码

  1. #include <stdio.h>
  2. #include <string.h>
  3. //包函libiconv库头文件
  4. #include <iconv.h>
  5.  
  6. int ChangeCode( const char* pFromCode,
  7.                     const char* pToCode,
  8.                     const char* pInBuf,
  9.                     size_t* iInLen,
  10.                     char* pOutBuf,
  11.                     size_t* iOutLen );
  12.  
  13. int main( int argc, char* argv[] )
  14. {
  15.     char sInBuf[100];
  16.     char sOutBuf[100];
  17.     size_t iInLen = 0;
  18.     size_t iOutLen = 100;
  19.     int iRet;
  20.     strcpy( sInBuf, "中文Source" );
  21.     memset( sOutBuf, 0x0, 100 );
  22.     iInLen = strlen( sInBuf );
  23.     iRet = ChangeCode( "UTF-8", "GBK", sInBuf, &iInLen, sOutBuf, &iOutLen );
  24.     printf("%s\n", sOutBuf);
  25.  
  26.     for (int i = 0; i < 15 ; i++)
  27.     {
  28.         printf("%x ", (unsigned char)sOutBuf[i] );
  29.     }
  30.      return 0;
  31. }
  32.  
  33. int ChangeCode( const char* pFromCode,
  34.                     const char* pToCode,
  35.                     const char* pInBuf,
  36.                     size_t* iInLen,
  37.                     char* pOutBuf,
  38.                     size_t* iOutLen )
  39. {
  40.      int iRet;
  41.      //打开字符集转换
  42.      iconv_t hIconv = iconv_open( pToCode, pFromCode );
  43.      if ( hIconv  == NULL)
  44.      {
  45.           return -1;//打开失败,可能不支持的字符集
  46.      }
  47.      //开始转换
  48.      iRet = iconv( hIconv, (char**)(&pInBuf), iInLen, (char**)(&pOutBuf), iOutLen );
  49.      //关闭字符集转换
  50.      iconv_close( hIconv );
  51.      return iRet;
  52. }


代码保存为utf8编码格式,假设前面配置过的 libiconv-1.14 文件夹就在当前目录,编译命令:

>gcc iconv.c -I./libiconv-1.14/include -L./libiconv-1.14/lib/.libs -liconv

运行提示
a.exe - 应用程序错误
应用程序无法正常启动(0xc000007b)。请单击“确定”关闭应用程序。

将 libiconv-2.dll 复制到当前目录,运行 a.exe

>a.exe
中文Source
d6 d0 ce c4 53 6f 75 72 63 65 0 0 0 0 0

Done


回到 “扩展库”

在线用户

用户浏览此论坛: Google [Bot] 和 2 访客