目录
一、编译环境准备
1.NDK下载
- 下载方式:点击下载链接,下载android-ndk-r21e-linux-x86_64.zip包即可。
- 官网下载链接:https://developer.android.google.cn/ndk/downloads
2.libxml2源码下载
-
方法一(http官网下载):
-
下载方式:
- 点击下载链接,下载libxml2.zip包即可。
- 通过git工具下载,指令为:
git clone https://gitlab.gnome.org/GNOME/libxml2.git
-
-
方法二(ftp官网下载):
-
下载方式:
- 点击下载链接,下载libxml2.zip包即可。
- 通过wget工具下载,指令为:
wget http://xmlsoft.org/sources/libxml2-2.9.12.tar.gz
-
官网下载连接:http://xmlsoft.org/sources/
-
二、编译流程
本次交叉编译起因是早先libxml2库在使用过程中,两个xml解析库函数xmlReadFile和xmlParseFile均无法解析GB2312格式的xml,并报错。经分析,该libxml2在编译时未引入libiconv.so动态库,该库为字符转码库,不引用该库,则libxml2仅支持UTF8格式的xml,因此本次编译的目的是增加对libiconv.so动态库的引用。
注意:
- ibxml2编译有两种方式,第一种采用配置./configure方式,第二种采用配置Cmake方式,本次采用第一种方式。
- 此时的libiconv.so必须为该交叉编译器编译过的so。
1.本地编译64位动态库
- 编译指令:
./configure --prefix=/home/jingwei/Program/libxml2git/libxml2/local --with-python=no –with-iconv=/home/jingwei/Program/libiconv-1.17/local
make
make install
2.交叉编译64位动态库
- 编译指令:
./configure CC=/home/jingwei/Program/android-ndk-r21e-linux-x86_64/android-ndk-r21e/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android21-clang LDFLAGS=-L/home/jingwei/Program/libiconv-1.17/localcross/lib LIBS=-liconv --prefix=/home/jingwei/Program/libxml2ftp/libxml2-2.9.11/localcross --host=aarch64-linux-android21 --with-python=no --with-iconv=/home/jingwei/Program/libiconv-1.17/localcross --with-zlib=no --with-lzma=no
make
make install
3.交叉编译32位动态库
- 编译指令:
./configure CC=/home/jingwei/Program/android-ndk-r21e-linux-x86_64/android-ndk-r21e/toolchains/llvm/prebuilt/linux-x86_64/bin/armv7a-linux-androideabi21-clang LDFLAGS=-L/home/jingwei/Program/libiconv-1.17/localcross32/lib LIBS=-liconv --prefix=/home/jingwei/Program/libxml2ftp/libxml2-2.9.11/localcross32 --host=armv7a-linux-androideabi21 --with-python=no --with-iconv=/home/jingwei/Program/libiconv-1.17/localcross32 --with-zlib=no --with-lzma=no
make
make install
3.交叉编译32位静态库
- 编译指令:
./configure CC=/home/jingwei/Program/android-ndk-r21e-linux-x86_64/android-ndk-r21e/toolchains/llvm/prebuilt/linux-x86_64/bin/armv7a-linux-androideabi21-clang LDFLAGS=-L/home/jingwei/Program/libiconv-1.17/localcross32/lib LIBS=-liconv --prefix=/home/jingwei/Program/libxml2ftp/libxml2-2.9.11/localcross32 --host=armv7a-linux-androideabi21 --with-python=no --with-iconv=/home/jingwei/Program/libiconv-1.17/localcross32 --with-zlib=no --with-lzma=no --enable-shared=no --enable-static=yes
make
make install
三、编译注意事项
- 若代码无configure,则先执行./autogen.sh即可,若没有autotool,libtool,python等工具,根据提示,使用apt install安装即可,如apt install autotool。
- Ubuntu需要设置iconv库的环境变量:
export LD_LIBRARY_PATH=/home/jingwei/Program/libiconv-1.17/local/lib
,最终在编译时出现checking for iconv in liconv… yes,则将incov则真正添加到libxml2中。 - –with-iconv 必须为iconv的源代码路径: /home/jingwei/Program/libiconv-1.17/localcross。
- 该libxml2源码仅能设置C的编译器,该库为c语言库,可以 设置CC编译器,目前通过./configure –help查找没有 CXX设置选项,因此若使用CXX选项设置clang++编译器,则无法进行交叉编译,应该设置CC为clang编译器。
- 使用ftp下载的libxml2-2.9.11编译通过,经测试git下载的libxml2-2.9.13编译显示没有libm.so,ftp下载的lixml2-2.9.1编译时问题较多,建议多下在不同版本尝试编译。
四、编译基础知识
- ./configure –help参数详解:
分为Program names,system types, Optional Features, Optional Packages。- –prefix =PREFIX:配置安装路径,要用绝对路径,make install时会把可执行文件、配置文件、库安装到指定路径的对应路径中,如bin,lib等,否则安装到默认路径/usr/local/下。
- –exec-prefic=EPREFIX:指定结构依赖的文件的位置,不指定则默认与PREFIX一致。
- –build=BUILD: 编译所在环境,默认使用当前主机进行编译,参数由config.guess猜。
- –host=HOST:指定交叉编译器,编译程序运行的机器。若不指定,使用config.guess猜。
- –target:编译新编译器用的,交叉编译和普通编译不需要。
- –with-PACKAGE:指定已有包的路径
- Pkg-config检索库的文件信息,使用pc文件,若库头文件不在/usr/local/中,则需要-I指定头文件。
- –enable-static =yes:编译为静态库
- –enable-shared=yes:编译为动态库
- –with-python=no:不构建python。
- CC:指定编译器的名字,若不配置则默认为host对应的GCC工具。
- ABI架构简介
+Aarch64:armv8架构的64位,精简指令集。
+I686: intel公司的686架构。
+Armv7a: armv7架构的32位,精简指令集。
+X86: intel公司的32位处理器,复杂指令集。
+X86_64: intel公司的64位处理器,复杂指令集。