编译可在Android上运行的依赖库(二):gettext库
随着代码的不断更新,原来的文章有很多地方已经不适用于现在,所有增加了本文章,对过去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库相关推荐
- 编译可在Android上运行的qemu user mode
前言 本文在Ubuntu 64位系统上对qemu项目进行交叉编译,并且只编译与qemu user mode有关的代码. 下文中的"NDK"若无特殊说明均指"Android ...
- android通过c调用shmat函数,编译可在Android上运行的qemu user mode
编译可在Android上运行的qemu user mode @(Android研究)[android|qemu] [TOC] 前言 本文在Ubuntu 64位系统上对qemu项目进行交叉编译,并且只编 ...
- 编译可在Android上运行的qemu
本文在ubuntu20.04上对qemu进行交叉编译 注意:NDK编译器工具API级别要在30以后,最好用33 因为只有30以后的版本支持函数memfd_create,详情请看http://t.csd ...
- 静态编译parted在Android上运行
[前言] 现在有越来越多的Android手机用上了GPT分区表.我目前接触过的有:华为C8816.G6-C00.Ascend P6,中兴U880E,还有亚马逊Kindle Fire.目前我不太好解释G ...
- ace+arm+linux,用NDK编译ACE在Android上运行
1.准备工具链 ./build/tools/make-standalone-toolchain.sh --toolchain=arm-linux-Androideabi-4.4.3 --arch=ar ...
- 编译可在Nexus5上运行的CyanogenMod13.0 ROM(基于Android6.0)
编译可在Nexus5上运行的CyanogenMod13.0 ROM (基于Android6.0) 作者:寻禹@阿里聚安全 前言 下文中无特殊说明时CM代表CyanogenMod的缩写. 下文中说的&q ...
- python程序在安卓上如何运行-在 android 上运行 python 的方法
在android上运行python脚本,或者在android上使用python交互界面,对熟悉python的研究或开发人员来说,是一件很有吸引力的事情,因为python脚本真是非常高效,另外,有很多非 ...
- 如何用android下载python_如何在android上运行Python代码
展开全部 在android上运行python脚本,或者在android上使用python交互界面,对熟悉python的研究或开发人员来说,是一件很有吸引力的e69da5e6ba906261696475 ...
- 有没有办法在Android上运行Python?
我们正在开发S60版本,该平台具有不错的Python API. 但是,关于Android上的Python尚无任何官方资料,但是由于Jython存在,有没有办法让蛇和机器人一起工作? #1楼 目前还没有 ...
最新文章
- jS四种函数的调用方式
- 树与二叉树(c/c++)
- 区块链BaaS云服务(29) 溪塔科技 CITA-Cloud
- Git强制覆盖还原本地救火命令
- 运行初始化过程代码笔记
- 大数据怎样帮助运维工程师实现无死角监控?
- win ollvm环境_Python3 环境搭建
- 高斯滤波matlab函数,matlab自带函数实现高斯滤波(gauss filter)快速算法
- 陈志行:计算机围棋程序手谈作者
- 温暖(warmth)
- Java怎么除以2_哪个更好的选项用于将整数除以2?
- [转载]雅礼中学2012届高三年级第三次阶段考试试卷
- fastdfs添加storage节点
- 华为NE5000E集群路由器荣获InfoVision奖
- 数学小白的探索-欧拉和费马
- Django SVG 名字空间
- angularjs pdf插件_AngularJS权威教程 PDF扫描版[14MB]
- 【快直播android demo】SDP交互
- apache-jmeter-5.5使用教程
- windows编程之计时器
热门文章
- 对未来的工作态度期许
- java疯狂讲义输入输出视频_疯狂JAVA讲义---第十五章:输入输出(上)流的处理和文件...
- Codeforces Contest 1138 problem B Circus —— 死亡1700,暴力
- 华为任正非:实事求是的科研方向与二十年的艰苦努力
- 北风设计模式课程---里氏代换原则
- 19秋计算机应用基础在线作业2,计算机应用基础19秋在线作业2 Windows 下能浏览并管理文件 驱动器及网络连接的强大工具是...
- springboot vue mybatis mysql校园疫情数据分析平台源码
- 今日说“法”:如何防止reg、wire型信号在使用逻辑分析仪时被优化
- 最赚钱H5游戏《大天使之剑H5》公测24天流水破亿!
- 手机耳机插入电脑没有反应