随着代码的不断更新,原来的文章有很多地方已经不适用于现在,所有增加了本文章,对过去NDK交叉编译gettext源码进行更改和补充。

下载gettext源码gettext-0.21.tar.gz:

Index of /pub/gnu/gettexthttps://ftp.gnu.org/pub/gnu/gettext/?C=M;O=A

tar -zxvf gettext-0.21.tar.gz

cd gettext-0.21 && mkdir build&&cd build

CC="aarch64-linux-android33-clang" CPP="aarch64-linux-android33-clang -E" CPPFLAGS="-I${SYSROOT}/usr/include" CXX="aarch64-linux-android33-clang++" CXXCPP="aarch64-linux-android33-clang++ -E" ../configure --prefix="/home/dubu/installtest" --host=arm-linux-android33 CFLAGS="-fPIC" --with-libiconv-prefix=${SYSROOT}/usr --with-sysroot=${SYSROOT}

make

make install

执行上述交叉编译以后,在make install的时候报错如下:

libtool: relink: aarch64-linux-android33-clang -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-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-python.o .libs/libgettextsrc_la-format-python-brace.o .libs/libgettextsrc_la-format-java.o .libs/libgettextsrc_la-format-java-printf.o .libs/libgettextsrc_la-format-csharp.o .libs/libgettextsrc_la-format-javascript.o .libs/libgettextsrc_la-format-scheme.o .libs/libgettextsrc_la-format-lisp.o .libs/libgettextsrc_la-format-elisp.o .libs/libgettextsrc_la-format-librep.o .libs/libgettextsrc_la-format-ruby.o .libs/libgettextsrc_la-format-sh.o .libs/libgettextsrc_la-format-awk.o .libs/libgettextsrc_la-format-lua.o .libs/libgettextsrc_la-format-pascal.o .libs/libgettextsrc_la-format-smalltalk.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-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-read-desktop.o .libs/libgettextsrc_la-locating-rule.o .libs/libgettextsrc_la-its.o .libs/libgettextsrc_la-search-path.o   -L/home/dubu/installtest/lib -L/home/dubu/android-ndk-r25/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib -L=/usr/lib -L/home/dubu/gettext-0.21/build2/gettext-tools/intl/.libs
-L/home/dubu/installtest/lib -lgettextlib
-L/home/dubu/android-ndk-r25/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib -ltextstyle
-lm -lintl -liconv -lc    -Wl,-soname -Wl,libgettextsrc-0.21.so
-o .libs/libgettextsrc-0.21.so
ld: error: unable to find library -lgettextlib
clang-14: error: linker command failed with exit code 1 (use -v to see invocation)
libtool:   error: error: relink 'libgettextsrc.la' with the above command before installing it
make[5]: *** [Makefile:3069:install-libLTLIBRARIES] 错误 1
make[5]: 离开目录“/home/dubu/gettext-0.21/build2/gettext-tools/src”

解决方法:

vi ~/gettext-0.21/build/gettext-tools/gnulib-lib/Makefile

找到如下内容:

install-exec-clean:
        case "linux-android33" in \
          aix*) ;; \
          *) rm -f $(DESTDIR)$(libdir)/libgettextlib.a ;; \
        esac

并将其修改为:
install-exec-clean:
        case "linux-android33" in \
          aix*) ;; \
          *) rm -f $(DESTDIR)$(libdir)/libgettextlib.a && \
          ln -sf $(DESTDIR)$(libdir)/libgettextlib-0.21.so $(DESTDIR)$(libdir)/libgettextlib.so ;; \
        esac

问题即可解决。

上面的修改是在make或者make install以后进行的。

问题到目前为止已经解决,接下来的内容是给不相信我的人看的,就是分析这样作的原因,给大家一个信服我的理由。如果你相信我,那就可以让make install永生了。

先看看报错内容:

在交叉编译生成.libs/libgettextsrc-0.21.so的时候找不到要链接的库-lgettextlib所以才报的错。

再看一下编译命令的其中一段:-L/home/dubu/installtest/lib -lgettextlib

这一段的意思是要去/home/dubu/installtest/lib这个路径下找动态库libgettextlib.so或者libgettextlib.a静态库,结果在这个路径下没有找到,为什么没有找到呢?

我们回溯一下,make clean&&make 2>&1 1>1,重新make并且把make的输出内容重定向到文件1中,vi 1,然后搜索libgettextlib.a,会找到如下内容

libtool: install: /usr/bin/install -c .libs/libgettextlib.a /home/dubu/installtest/lib/libgettextlib.a
libtool: install: chmod 644 /home/dubu/installtest/lib/libgettextlib.a
libtool: install: ranlib /home/dubu/installtest/lib/libgettextlib.a
case "linux-android33" in \aix*) ;; \*) rm -f /home/dubu/installtest/lib/libgettextlib.a ;; \
esac

make的时候已经安装了libgettextlib.a,但是因为不是aix系统,所以又把libgettextlib.a这个静态库给删除了,所以下面编译生成.libs/libgettextsrc-0.21.so找不到-lgettextlib了。

但是如果不用交叉编译的话,直接进行如下命令:

cd gettext-0.21 && mkdir buildbak && cd buildbak

../configure

make 2>&1 1>1

make install

这是没有问题的。那么为什么在这里make install 就可以成功,交叉编译make install 就会失败。

我们来看看输出文档,vi 1 (这里的文件1是在buildbak目录下,不是在build目录下),然后搜索libgettextlib.so,找出如下内容:

libtool: link: (cd ".libs" && rm -f "libgettextlib.so" && ln -s "libgettextlib-0.21.so" "libgettextlib.so")

由此可以看出 libgettextlib.so是libgettextlib-0.21.so的连接文件。

并且用NDK对gettext进行交叉编译的时候是没有 libgettextlib.so生成的,所以就在交叉编译make 以后,用上面的解决方法就可以了。

编译可在Android上运行的依赖库(二):gettext库相关推荐

  1. 编译可在Android上运行的qemu user mode

    前言 本文在Ubuntu 64位系统上对qemu项目进行交叉编译,并且只编译与qemu user mode有关的代码. 下文中的"NDK"若无特殊说明均指"Android ...

  2. android通过c调用shmat函数,编译可在Android上运行的qemu user mode

    编译可在Android上运行的qemu user mode @(Android研究)[android|qemu] [TOC] 前言 本文在Ubuntu 64位系统上对qemu项目进行交叉编译,并且只编 ...

  3. 编译可在Android上运行的qemu

    本文在ubuntu20.04上对qemu进行交叉编译 注意:NDK编译器工具API级别要在30以后,最好用33 因为只有30以后的版本支持函数memfd_create,详情请看http://t.csd ...

  4. 静态编译parted在Android上运行

    [前言] 现在有越来越多的Android手机用上了GPT分区表.我目前接触过的有:华为C8816.G6-C00.Ascend P6,中兴U880E,还有亚马逊Kindle Fire.目前我不太好解释G ...

  5. ace+arm+linux,用NDK编译ACE在Android上运行

    1.准备工具链 ./build/tools/make-standalone-toolchain.sh --toolchain=arm-linux-Androideabi-4.4.3 --arch=ar ...

  6. 编译可在Nexus5上运行的CyanogenMod13.0 ROM(基于Android6.0)

    编译可在Nexus5上运行的CyanogenMod13.0 ROM (基于Android6.0) 作者:寻禹@阿里聚安全 前言 下文中无特殊说明时CM代表CyanogenMod的缩写. 下文中说的&q ...

  7. python程序在安卓上如何运行-在 android 上运行 python 的方法

    在android上运行python脚本,或者在android上使用python交互界面,对熟悉python的研究或开发人员来说,是一件很有吸引力的事情,因为python脚本真是非常高效,另外,有很多非 ...

  8. 如何用android下载python_如何在android上运行Python代码

    展开全部 在android上运行python脚本,或者在android上使用python交互界面,对熟悉python的研究或开发人员来说,是一件很有吸引力的e69da5e6ba906261696475 ...

  9. 有没有办法在Android上运行Python?

    我们正在开发S60版本,该平台具有不错的Python API. 但是,关于Android上的Python尚无任何官方资料,但是由于Jython存在,有没有办法让蛇和机器人一起工作? #1楼 目前还没有 ...

最新文章

  1. jS四种函数的调用方式
  2. 树与二叉树(c/c++)
  3. 区块链BaaS云服务(29) 溪塔科技 CITA-Cloud
  4. Git强制覆盖还原本地救火命令
  5. 运行初始化过程代码笔记
  6. 大数据怎样帮助运维工程师实现无死角监控?
  7. win ollvm环境_Python3 环境搭建
  8. 高斯滤波matlab函数,matlab自带函数实现高斯滤波(gauss filter)快速算法
  9. 陈志行:计算机围棋程序手谈作者
  10. 温暖(warmth)
  11. Java怎么除以2_哪个更好的选项用于将整数除以2?
  12. [转载]雅礼中学2012届高三年级第三次阶段考试试卷
  13. fastdfs添加storage节点
  14. 华为NE5000E集群路由器荣获InfoVision奖
  15. 数学小白的探索-欧拉和费马
  16. Django SVG 名字空间
  17. angularjs pdf插件_AngularJS权威教程 PDF扫描版[14MB]
  18. 【快直播android demo】SDP交互
  19. apache-jmeter-5.5使用教程
  20. windows编程之计时器

热门文章

  1. 对未来的工作态度期许
  2. java疯狂讲义输入输出视频_疯狂JAVA讲义---第十五章:输入输出(上)流的处理和文件...
  3. Codeforces Contest 1138 problem B Circus —— 死亡1700,暴力
  4. 华为任正非:实事求是的科研方向与二十年的艰苦努力
  5. 北风设计模式课程---里氏代换原则
  6. 19秋计算机应用基础在线作业2,计算机应用基础19秋在线作业2 Windows 下能浏览并管理文件 驱动器及网络连接的强大工具是...
  7. springboot vue mybatis mysql校园疫情数据分析平台源码
  8. 今日说“法”:如何防止reg、wire型信号在使用逻辑分析仪时被优化
  9. 最赚钱H5游戏《大天使之剑H5》公测24天流水破亿!
  10. 手机耳机插入电脑没有反应