编译环境
- 使用的glib是版本是:glib-2.70.1.tar.xz;
- 宿主机:ubuntu16.04
- meson 版本0.56
背景:
因为开发需要使用glib, 所以需要将glib交叉编译到我自己的开发板中。
x86_64 上编译
对于在ubuntu上编译没什么难度,基本上通过以下命令就可以
mkdir build
meson -C build
ninja -C build
ninja -C install
对于meson 找不到的lib库,我们可以手动下载编译安装到本地即可。
比如找不到libffi、libpcre的库等等
解决方法:
sudo apt-get install libffi-dev
sudo apt-get install libpcre
交叉编译
接下来交叉编译我确实遇到了比较多的问题,因为第一次使用meson 构建交叉编译的环境,所以遇到了几个坑,在此记录一下,希望对后面其他小伙伴碰到此类相同的问题时,少走一些弯路
1 . 使用meson 交叉编译需要写一个cross-file.txt 这样的一个文件;(文件名和文件后缀不限)
此文件的主要作用就是指明是交叉编译,指明交叉编译的工具:
比如我的文件内容是:
[host_machine]
system = 'linux'
cpu_family = 'arm'
cpu = 'ARM7'
endian = 'little'
[properties]
PKG_CONFIG_LIBDIR = '/home/book/workbase/pcre-8.37/_install/lib/pkgconfig'
[binaries]
c = 'arm-oe-linux-gnueabi-gcc'
cpp = 'arm-oe-linux-gnueabi-g++'
ar = 'arm-oe-linux-gnueabi-ar'
ld = 'arm-oe-linux-gnueabi-ld'
objcopy = 'arm-oe-linux-gnueabi-objcopy'
strip = 'arm-oe-linux-gnueabi-strip'
然后配置:
meson build/ --cross-file cross-file.txt --prefix=$(pwd)/_install
接下来我遇到了两个找不到lib库的问题,凭着自己之前的经验,就是将缺少的动态库下载到本地,然后交叉编译后,编译glib的时候使用-L 指明使用到的lib库的路径,这也是之前使用configue 构建交叉编译库最常用的手段。
但是meson构建不是这样的,meson 根本就不识别-I、-L这些东西
我直接说解决方法:
我遇到的第一个问题就是如图所示:
找不到libffi的动态库,meson 会直接去 https://ftp.pcre.org/pub/pcre/pcre-8.37.tar.bz2 这个地方下载,但是我自己google之后,发现这个地址已经变了所以手动将这个url修正过来
这个url的定义是在glib下的subprojects 文件夹下有个libpcre.wrap的文件
打开之后
[wrap-file]
directory = pcre-8.37
source_url = https://ftp.pcre.org/pub/pcre/pcre-8.37.tar.bz2
source_filename = pcre-8.37.tar.bz2
source_hash = 51679ea8006ce31379fb0860e46dd86665d864b5020fc9cd19e71260eef4789d
patch_filename = pcre_8.37-2_patch.zip
patch_url = https://wrapdb.mesonbuild.com/v2/pcre_8.37-2/get_patch
patch_hash = 6b80f72385e1bf06721e26fbc83aced576e9c0d3182d86a55dd173a04050fe26
[provide]
libpcre = pcre_dep
我的改动:
source_url = https://ftp.exim.org/pub/pcre/pcre-8.37.tar.bz2
注意这个文件不要随意更改,不要随意更改,不要随意更改!!
将url改好之后,如果网络环境正常并且你的ubunut 的dns配置也正确的话这个错误应该就解决了
接下来我遇到的另一个问题:
就是找不到libffi的动态库,我一开始的解决办法是按照解决第一个问题的方法来的,但是却不行,我仔细看了一下subprojects 下的libffi.wrap 这个文件:
[wrap-git]
directory=libffi
url=https://gitlab.freedesktop.org/gstreamer/meson-ports/libffi.git
revision=meson
depth=1
我们仔细看libffi.wrap 和上一个问题的libpcre.wrap 这两个文件格式一样 但是内容却不一样,这也是这个问题的核心
格式内容我放到后面再说,直接说解决方法:
[wrap-file]
directory=libffi-master
source_url=
source_filename=/home/book/workbase/glib-2.70.1/subprojects/packagecache/libffi-master.zip
source_hash = 3cc94b982d3ea09d05ae59eae7f6f629c5a3cbef9fce1e143f69142ddfe6be93
[provide]
libffi=libffi
这样修改之后 问题完美解决;
为什么这么修改,等我慢慢说来,细心的同学肯定也发现了 我修改的这个libffi.wrap
和上面libpcre.wrap 格式虽然一样 但是 source_url= 为空,source_filename=后面是本地的路径
我自己也增加了一个hash值。
要想明白为什么这么改 得先搞清楚wrap文件的格式:
meson .wrap文件格式
[https://mesonbuild.com/Wrap-dependency-system-manual.html]
这是wrap 的官网:
简单翻译一下,意思就是:
meson 有一些列的subprojects, 这些subprojecct 被嵌套工程里面,就是你要编译的工程下面会有一个subprojects目录;在这个目录下面你可以铜管指定Wrap文件告诉meson怎么去下载依赖的库,怎么自动的提取并去构建他这个wrap的名字格式就是<project_name>.wrap;
一共有四种的wraps:
wrap-file
wrap-git
wrap-hg
wrap-svn
我上面解决自己的问题的发现:
wrap文件格式一定要准确,否则meson 构建会出错
wrap中sorce_filename 可以是本地的目录,但是这个目录一定要subobjects/packagecache/ 中
wrap文件中的directory= 的值就是江packagecache中对应的包解压之后得到的,一定要和解压之后的名称一致,否meson无法找到对应的库