编译可在Android上运行的gettext库

编译可在Android上运行的gettext库

@(Android研究)[android|gettext]


[TOC]


本文公开首发于阿里聚安全博客:https://jaq.alibaba.com/community/index.htm?spm=0.0.0.0.ycEUXK

前言

gettext版本:0.19.7。

本文在Ubuntu 64位系统上对gettext项目进行交叉编译。

下文中的"NDK"若无特殊说明均指"Android NDK"。

注意:不要运行gettext源码目录下的autogen.sh文件。如果先运行autogen.sh然后运行configure再然后使用make命令编译时,编译会出错。

步骤

1. 安装必要的工具

如果不安装这些工具编译时将出错。

automake-1.15

必须安装1.15版本。

下载网址:http://ftp.gnu.org/gnu/automake/

下载后需要编译安装,命令:

./configure
make
sudo make install
texinfo

在unbuntu中安装texinfo。

2. 下载并安装Android NDK

下载并安装Android NDK的过程在这里不做介绍。

3. 下载gettext

到gettext的官网去下载这个库的源码。下载地址:http://ftp.gnu.org/pub/gnu/gettext/

4. 设置NDK和SYSROOT环境变量

请参考编译可在Android上运行的glib库中相应的步骤。

5. 创建NDK工具的软链接

请参考编译可在Android上运行的libiconv库中的相应步骤。

6. 运行configure

"LDFLAGS=./gettext-tools/gnulib-lib/.libs/" CPP="arm-linux-eabi-gcc -E" CPPFLAGS="-I${SYSROOT}/usr/include" ./configure --prefix="${SYSROOT}/usr" --host=arm-linux-eabi CFLAGS="--sysroot $SYSROOT"

--host选项的值"arm-linux-eabi"在configure脚本中会被扩展成"arm-linux-eabi-gcc"这样的编译工具名。--host选项的值必须包含在软链接的名字中,举例,如果有个软链接名为arm-linux-eabi-gcc,那么--host选项的值就必须是arm-linux-eabi;如果有个软链接名为arm-linux-eabiabc-gcc,那么--host选项的值就必须是arm-linux-eabiabc。

LDFLAGS指向的目录是gettext编译输出的目录,如果不添加这个目录,在gettext安装时将会报"error: cannot find -lgettextlib"这个错误,在下面“编译问题排错”一节有对这个错误进行解析。

CPP指定C预处理器,其中的"-E"命令选项是必须,如果没有这个命令选项将会报出下面的错误:

"C preprocessor arm-linux-eabi-gcc fails sanity check

奇怪的是,我在Linux上不指定CPP和CPPFLAGS宏进行编译不会报上面的错误,而在Mac OSX系统上不指定CPP和CPPFLAGS宏就会报上面的错误。

7. 编译和安装

使用make命令编译源码,当编译成功是使用"make install"命令进行安装,gettext将会被安装到${SYSROOT}/usr/lib目录下,在上文中"--prefix="${SYSROOT}/usr"命令选项就是用来指定安装的目录的。

编译问题排错

编译问题一

编译时可能会报下面的错误:

msginit.c: In function 'get_user_fullname':
msginit.c:1084:21: error: 'struct passwd' has no member named 'pw_gecos'

源码:

fullname = pwd->pw_gecos;

简单修复:

#ifndef __ANDROID__
      fullname = pwd->pw_gecos;
#else
      fullname = "android";
#endif

error: cannot find -lgettextlib

错误信息:

Making install in src
/Applications/Xcode.app/Contents/Developer/usr/bin/make  install-am
 ../../build-aux/install-sh -c -d '/Users/XXX/NVPACK/android-ndk-r10e/platforms/android-21/arch-arm/usr/lib'
 /bin/sh ../libtool   --mode=install /usr/bin/install -c   libgettextsrc.la '/Users/XXX/NVPACK/android-ndk-r10e/platforms/android-21/arch-arm/usr/lib'
libtool: warning: relinking 'libgettextsrc.la'
libtool: install: (cd /Users/XXX/Codes/Projects/qemu-for-android/gettext-0.19.7/gettext-tools/src; /bin/sh "/Users/XXX/Codes/Projects/qemu-for-android/gettext-0.19.7/gettext-tools/libtool"  --tag CC --mode=relink arm-linux-androideabi-gcc -std=gnu99 --sysroot /Users/XXX/NVPACK/android-ndk-r10e/platforms/android-21/arch-arm -release 0.19.7 ../gnulib-lib/libgettextlib.la ../intl/libintl.la -L/Users/XXX/NVPACK/android-ndk-r10e/platforms/android-21/arch-arm/usr/lib -liconv -L/Users/XXX/NVPACK/android-ndk-r10e/platforms/android-21/arch-arm/usr/lib -liconv -lc -no-undefined -o libgettextsrc.la -rpath /Users/XXX/NVPACK/android-ndk-r10e/platforms/android-21/arch-arm/usr/lib libgettextsrc_la-message.lo libgettextsrc_la-po-error.lo libgettextsrc_la-po-xerror.lo libgettextsrc_la-read-catalog-abstract.lo libgettextsrc_la-po-lex.lo libgettextsrc_la-po-gram-gen.lo libgettextsrc_la-po-charset.lo libgettextsrc_la-read-po.lo libgettextsrc_la-read-properties.lo libgettextsrc_la-read-stringtable.lo libgettextsrc_la-open-catalog.lo libgettextsrc_la-dir-list.lo libgettextsrc_la-str-list.lo libgettextsrc_la-read-catalog.lo libgettextsrc_la-color.lo libgettextsrc_la-write-catalog.lo libgettextsrc_la-write-properties.lo libgettextsrc_la-write-stringtable.lo libgettextsrc_la-write-po.lo libgettextsrc_la-msgl-ascii.lo libgettextsrc_la-msgl-iconv.lo libgettextsrc_la-msgl-equal.lo libgettextsrc_la-msgl-cat.lo libgettextsrc_la-msgl-header.lo libgettextsrc_la-msgl-english.lo libgettextsrc_la-msgl-check.lo libgettextsrc_la-file-list.lo libgettextsrc_la-msgl-charset.lo libgettextsrc_la-po-time.lo libgettextsrc_la-plural-exp.lo libgettextsrc_la-plural-eval.lo libgettextsrc_la-plural-table.lo libgettextsrc_la-sentence.lo libgettextsrc_la-format.lo libgettextsrc_la-format-c.lo libgettextsrc_la-format-sh.lo libgettextsrc_la-format-python.lo libgettextsrc_la-format-python-brace.lo libgettextsrc_la-format-lisp.lo libgettextsrc_la-format-elisp.lo libgettextsrc_la-format-librep.lo libgettextsrc_la-format-scheme.lo libgettextsrc_la-format-java.lo libgettextsrc_la-format-csharp.lo libgettextsrc_la-format-awk.lo libgettextsrc_la-format-pascal.lo libgettextsrc_la-format-ycp.lo libgettextsrc_la-format-tcl.lo libgettextsrc_la-format-perl.lo libgettextsrc_la-format-perl-brace.lo libgettextsrc_la-format-php.lo libgettextsrc_la-format-gcc-internal.lo libgettextsrc_la-format-gfc-internal.lo libgettextsrc_la-format-qt.lo libgettextsrc_la-format-qt-plural.lo libgettextsrc_la-format-kde.lo libgettextsrc_la-format-kde-kuit.lo libgettextsrc_la-format-boost.lo libgettextsrc_la-format-lua.lo libgettextsrc_la-format-javascript.lo libgettextsrc_la-read-desktop.lo libgettextsrc_la-locating-rule.lo libgettextsrc_la-its.lo )
libtool: relink: arm-linux-androideabi-gcc -std=gnu99 -shared  -fPIC -DPIC  .libs/libgettextsrc_la-message.o .libs/libgettextsrc_la-po-error.o .libs/libgettextsrc_la-po-xerror.o .libs/libgettextsrc_la-read-catalog-abstract.o .libs/libgettextsrc_la-po-lex.o .libs/libgettextsrc_la-po-gram-gen.o .libs/libgettextsrc_la-po-charset.o .libs/libgettextsrc_la-read-po.o .libs/libgettextsrc_la-read-properties.o .libs/libgettextsrc_la-read-stringtable.o .libs/libgettextsrc_la-open-catalog.o .libs/libgettextsrc_la-dir-list.o .libs/libgettextsrc_la-str-list.o .libs/libgettextsrc_la-read-catalog.o .libs/libgettextsrc_la-color.o .libs/libgettextsrc_la-write-catalog.o .libs/libgettextsrc_la-write-properties.o .libs/libgettextsrc_la-write-stringtable.o .libs/libgettextsrc_la-write-po.o .libs/libgettextsrc_la-msgl-ascii.o .libs/libgettextsrc_la-msgl-iconv.o .libs/libgettextsrc_la-msgl-equal.o .libs/libgettextsrc_la-msgl-cat.o .libs/libgettextsrc_la-msgl-header.o .libs/libgettextsrc_la-msgl-english.o .libs/libgettextsrc_la-msgl-check.o .libs/libgettextsrc_la-file-list.o .libs/libgettextsrc_la-msgl-charset.o .libs/libgettextsrc_la-po-time.o .libs/libgettextsrc_la-plural-exp.o .libs/libgettextsrc_la-plural-eval.o .libs/libgettextsrc_la-plural-table.o .libs/libgettextsrc_la-sentence.o .libs/libgettextsrc_la-format.o .libs/libgettextsrc_la-format-c.o .libs/libgettextsrc_la-format-sh.o .libs/libgettextsrc_la-format-python.o .libs/libgettextsrc_la-format-python-brace.o .libs/libgettextsrc_la-format-lisp.o .libs/libgettextsrc_la-format-elisp.o .libs/libgettextsrc_la-format-librep.o .libs/libgettextsrc_la-format-scheme.o .libs/libgettextsrc_la-format-java.o .libs/libgettextsrc_la-format-csharp.o .libs/libgettextsrc_la-format-awk.o .libs/libgettextsrc_la-format-pascal.o .libs/libgettextsrc_la-format-ycp.o .libs/libgettextsrc_la-format-tcl.o .libs/libgettextsrc_la-format-perl.o .libs/libgettextsrc_la-format-perl-brace.o .libs/libgettextsrc_la-format-php.o .libs/libgettextsrc_la-format-gcc-internal.o .libs/libgettextsrc_la-format-gfc-internal.o .libs/libgettextsrc_la-format-qt.o .libs/libgettextsrc_la-format-qt-plural.o .libs/libgettextsrc_la-format-kde.o .libs/libgettextsrc_la-format-kde-kuit.o .libs/libgettextsrc_la-format-boost.o .libs/libgettextsrc_la-format-lua.o .libs/libgettextsrc_la-format-javascript.o .libs/libgettextsrc_la-read-desktop.o .libs/libgettextsrc_la-locating-rule.o .libs/libgettextsrc_la-its.o   -L/Users/XXX/NVPACK/android-ndk-r10e/platforms/android-21/arch-arm/usr/lib -L/Users/XXX/Codes/Projects/qemu-for-android/gettext-0.19.7/gettext-tools/intl/.libs -L/Users/XXX/NVPACK/android-ndk-r10e/platforms/android-21/arch-arm/usr/lib -lgettextlib -lm -lintl /Users/XXX/NVPACK/android-ndk-r10e/platforms/android-21/arch-arm/usr/lib/libiconv.a -lc  --sysroot /Users/XXX/NVPACK/android-ndk-r10e/platforms/android-21/arch-arm   -fopenmp -Wl,-soname -Wl,libgettextsrc-0.19.7.so -o .libs/libgettextsrc-0.19.7.so
/Users/XXX/NVPACK/android-ndk-r10e/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.9/../../../../arm-linux-androideabi/bin/ld: error: cannot find -lgettextlib
collect2: error: ld returned 1 exit status
libtool:   error: error: relink 'libgettextsrc.la' with the above command before installing it
make[5]: *** [install-libLTLIBRARIES] Error 1
make[4]: *** [install-am] Error 2
make[3]: *** [install] Error 2
make[2]: *** [install-recursive] Error 1
make[1]: *** [install-recursive] Error 1
make: *** [install] Error 2

这个错误在编译gettext时不会发生,而会在执行make install的时候发生,它会找不到libgettextlib.a这个库。当编译成功时,libgettextlib.a这个库是会生成的,这个库的路径在这个目录中:<gettext源码目录>/gettext-tools/gnulib-lib/.libs/,将这个路径添加到configure命令行的库搜索路径中,上面的configure的命令行选项中设置了这个目录。

注意:如果出现这个错误需要先使用"make clean && make distclean"命令清理项目,然后再将gettext库路径添加到configure命令行的库搜索路径中。

转载于:https://my.oschina.net/ibuwai/blog/664572

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值