arm-linux-cc 4.4.3 交叉编译glib 2.70.2

本文记录ubuntn18.04平台使用arm-linux-cc 4.4.3 交叉编译glib 2.70.2过程。

1 交叉编译libpcre

编译glib依赖libffi、zlib、以及libpcre,glib从2.6以后就切换到meson编译系统了,meson可以将依赖的lib作为子项目,编译目标项目时可以自动下载子项目的source code并编译,前提需要配置子项目的clone地址,因此不必要像makefile那样需要先编译子项目。其中libffi、zlib这两个依赖编译的时候会自动下载源代码,但是libpcre提供的源代码地址方法不了,因此需要先编译安装到toolchain路径。

1 libpcre代码下载

wget https://netix.dl.sourceforge.net/project/pcre/pcre/8.44/pcre-8.44.tar.gz
sudo tar -zxvf pcre-8.44.tar.gz
cd pcre-8.44

2 配置makefile

./configure  --host=arm-none-linux-gnueabi \
--target=arm-none-linux-gnueabi \
--prefix=/usr/local/arm/opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi \
CC=arm-none-linux-gnueabi-gc

3 编译安装

make
#安装前切换为root用户
sudo su
make install
#安装完毕切换回原来的user
su username

2 glib代码下载

glib比较大,gitlab地址下载比较慢,推荐使用国内gitee镜像下载,镜像会每天同步一次。

git clone https://gitee.com/mirrors/glib.git -b 2.70.2
cd glib

3 交叉编译

meson 交叉编译时需要创建一个交叉编译配置文件cross_file.txt

[properties]
pkg_config_libdir = ['/usr/local/arm/opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi/lib/pkgconfig']

[binaries]
c = 'arm-none-linux-gnueabi-gcc'
cpp = 'arm-none-linux-gnueabi-g++'
ar = 'arm-none-linux-gnueabi-ar'
strip = 'arm-none-linux-gnueabi-strip'
pkgconfig = 'pkg-config'

[host_machine]
system = 'linux'
cpu_family = 'arm'
cpu = 'ARM9'
endian = 'little'

[build_machine]
system = 'linux'
cpu_family = 'x86_64'
cpu = 'i686'
endian = 'little'

meson配置

meson \
--cross-file cross_file.txt \
--prefix=$(pwd)/install \
-Dinternal_pcre=true \
-Dselinux=false \
-Dinstalled_tests=false \
-Ddtrace=false \
-Dfam=false \
-Dsystemtap=false \
-Dselinux=disabled \
-Dlibelf=disabled \
-Dlibmount=disabled build

编译

cd build
ninja
ninja install

执行ninja时出现了以下错误:

In file included from ../glib/gnulib/vasnprintf.c:90:
../glib/gnulib/xsize.h:65: error: no previous prototype for 'xsum'
../glib/gnulib/xsize.h:76: error: no previous prototype for 'xsum3'
../glib/gnulib/xsize.h:86: error: no previous prototype for 'xsum4'
../glib/gnulib/xsize.h:96: error: no previous prototype for 'xmax'
[18/477] Compiling C object glib/gnulib/libgnulib.a.p/xsize.c.o
FAILED: glib/gnulib/libgnulib.a.p/xsize.c.o 

谷歌百度上找了好久也没发现答案,根本没有相同的情况,只好看build脚本。报错是在编译vasnprintf.c文件时,vasnprintf是glib提供的一个打印函数,因此可以不编译,直接使用系统的打印函数就可以。因此修改根目录meson.build文件,在大约1096行加一句use_system_printf = true,强制使用系统print,不编译vasnprintf。

# Our printf is 'good' only if vsnpintf()/snprintf()/printf() supports C99 well enough
use_system_printf = have_good_vsnprintf and have_good_snprintf and have_good_printf
use_system_printf = true
glib_conf.set('USE_SYSTEM_PRINTF', use_system_printf)
glibconfig_conf.set('GLIB_USING_SYSTEM_PRINTF', use_system_printf)

修改湾需要重新配置meson才能生效。

cd ../
rm -rf build

重新执行meson配置和编译就ok了,最终截图如下。
arm-linux-cc 4.4.3 交叉编译glib 2.70.2_第1张图片

你可能感兴趣的:(ubuntu,glib,linux,arm,交叉编译)