glib
编译机版本:Linux ubuntu18 5.4.0-150-generic
交叉编译链:arm-none-linux-gnueabihf-gcc(version 9.2.1 20191025)
glib版本:glib-2.78.0
目标芯片:STM32PM157
参考文章:arm-linux-cc 4.4.3 交叉编译glib 2.70.2_交叉编译 glib-CSDN博客
如果你是编译2.6之前的版本,需要使用configure进行编译配置,对于依赖的库需要自己进行源码下载和交叉编译,编译glib依赖libffi、zlib、以及libpcre,也就是在编译glib之前需要交叉编译libffi、zlib、以及libpcre。
但在2.6版本之后,编译工具切换到了meson,meson可以将依赖的lib作为子项目,编译目标项目时可以自动下载子项目的source code并编译,因此不必要像makefile那样需要先编译子项目。
下面讲一下我是用meson进行交叉编译的过程,和遇到的问题。
首先在Index of /sources/glib/ (gnome)这里下载glib源码,这一需要注意的是,并不是位置在最下面的就是最新的,目前最新的版本是2.78并不是2.9,2.9其实是2.09.
首先需要准备一个交叉编译配置文件cross_file.txt,这里直接照抄
[properties]
pkg_config_libdir = ['/home/alientek/Desktop/arm_lib/lib/pkgconfig'][binaries]
c = 'arm-none-linux-gnueabihf-gcc'
cpp = 'arm-none-linux-gnueabihf-g++'
ar = 'arm-none-linux-gnueabihf-ar'
strip = 'arm-none-linux-gnueabihf-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'
pkg_config_libdir是pkg的配置目录,这里写的是我的交叉编译pkg配置目录。
arm-none-linux-gnueabihf-*这些是交叉编译链的命令,如果使用的是其他交叉编译链,这里需要根据对应的编译链名字配置。
host_machine部分是你的芯片配置,需要根据具体芯片配置了。
配置之后就可以开始用meson配置了,但是不要使用ubuntu下载的meson。因为Ubuntu下载的meson版本低,会导致编译报错
alientek@ubuntu18:~/Desktop/threelibrary/test/glib-2.78.0$ meson -v
0.45.1
alientek@ubuntu18:~/Desktop/threelibrary/test/glib-2.78.0$ meson --cross-file cross_file.txt --prefix=/home/alientek/Desktop/arm_lib -Dinternal_pcre=true -Dselinux=false -Dinstalled_tests=false -Ddtrace=false -Dfam=false -Dsystemtap=false -Dselinux=disabled -Dlibelf=disabled -Dlibmount=disabled build
The Meson build system
Version: 0.45.1
Source dir: /home/alientek/Desktop/threelibrary/test/glib-2.78.0
Build dir: /home/alientek/Desktop/threelibrary/test/glib-2.78.0/build
Build type: cross buildmeson.build:15:13: ERROR: lexer
c_standards = {}^A full log can be found at /home/alientek/Desktop/threelibrary/test/glib-2.78.0/build/meson-logs/meson-log.txt
需要使用python下载的meson才行,或者自己下载最新的meson源码编译使用。
这里就使用python下载的方式进行了。
首先需要更新python3到3.7或更高,Ubuntu自带的python3.6,这个下载的meson是不行的,而且非常有趣。
错误尝试如下,
用python3.6下载meson后,运行meson,meson要求python3.7及以上的python版本;
升级python3.7后,运行meson报告meson版本过低错误;
使用python3.7更新meson后才能正常使用。
所以这里直接跳过这个坑,我们先升级python3.7.
sudo apt install python3.7
安装完成后需要配置系统python默认调用命令,
alientek@ubuntu18:~/Desktop/threelibrary/test/glib-2.78.0$ python3
Python 3.6.5 (default, Dec 9 2021, 17:04:37)
[GCC 8.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> quit()
表明默认的python3命令调用的是python3.6,此时你的电脑中已经同时拥有3.6和3.7版本了,需要重新配置。
配置命令如下:
sudo update-alternatives --list python
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.7 1
sudo update-alternatives --list python
输出
/usr/bin/python3.7
此时你再调用python3用的就是3.7了
安装meson
alientek@ubuntu18:~/Desktop/threelibrary/test/glib-2.78.0$ pip3 install meson
Collecting mesonUsing cached .2.3-py3-none-any.whl
Installing collected packages: meson
Successfully installed meson-1.2.3
此时你就拥有了meson,现在已经可以进行编译,但是如果直接敲meson会调用Ubuntu安装的meson,python下载的meson在~/.local/bin/meson目录下,你或者直接把这个替换系统的,或者编译时敲全路径。
/home/alientek/.local/bin/meson --cross-file cross_file.txt --prefix=/home/alientek/Desktop/arm_lib -Dselinux=false -Dinstalled_tests=false -Ddtrace=false -Dsystemtap=false -Dselinux=disabled -Dlibelf=disabled -Dlibmount=disabled build
--prefix=是编译后的安装路径。
执行后需要下载依赖包,依赖包会从github下载,可能下载不下来,咱们可以使用迅雷或者镜像中下载后复制到build文件夹中,然后重新执行。
Looking for a fallback subproject for the dependency libpcre2-8
Downloading pcre2 source from .42/pcre2-10.42.tar.bz2
WARNING: failed to download with error: The read operation timed out. Trying after a delay...
<urlopen error [Errno 111] Connection refused>
WARNING: failed to download with error: could not get .42/pcre2-10.42.tar.bz2 is the internet available?. Trying after a delay...
<urlopen error [Errno 111] Connection refused>
WARNING: failed to download with error: could not get .42/pcre2-10.42.tar.bz2 is the internet available?. Trying after a delay...
<urlopen error [Errno 111] Connection refused>
WARNING: failed to download with error: could not get .42/pcre2-10.42.tar.bz2 is the internet available?. Trying after a delay...
<urlopen error [Errno 111] Connection refused>
WARNING: failed to download with error: could not get .42/pcre2-10.42.tar.bz2 is the internet available?. Trying after a delay...
<urlopen error [Errno 111] Connection refused>
A fallback URL could be specified using source_fallback_url key in the wrap filemeson.build:2103:10: ERROR: could not get .42/pcre2-10.42.tar.bz2 is the internet available?A full log can be found at /home/alientek/Desktop/threelibrary/test/glib-2.78.0/build/meson-logs/meson-log.txt
下载正确之后
glib 2.78.0Build environmenthost cpu : armhost endian : littlehost system : linuxC Compiler : gccC++ Compiler : gccshared build : Truestatic build : FalseDirectoriesprefix : /home/alientek/Desktop/arm_libbindir : /home/alientek/Desktop/arm_lib/binlibexecdir : /home/alientek/Desktop/arm_lib/libexecpkgdatadir : /home/alientek/Desktop/arm_lib/share/glib-2.0datadir : /home/alientek/Desktop/arm_lib/shareincludedir : /home/alientek/Desktop/arm_lib/include/glib-2.0giomodulesdir : /home/alientek/Desktop/arm_lib/lib/gio/moduleslocalstatedir : /home/alientek/Desktop/arm_lib/varrunstatedir : /runOptionsselinux : Falselibmount : Falsexattr : Falseman : Falsedtrace : Falsesystemtap : Falsesysprof : Falsegtk_doc : Falsebsymbolic_functions: Trueforce_posix_threads: Falsetests : Trueinstalled_tests : Falsenls : autooss_fuzz : disabledglib_debug : autoglib_assert : Trueglib_checks : Truelibelf : disabledmultiarch : FalseSubprojectsgvdb : YESUser defined optionsCross files : cross_file.txtprefix : /home/alientek/Desktop/arm_libdtrace : falseinstalled_tests : falselibelf : disabledlibmount : disabledselinux : disabledsystemtap : falseFound ninja-1.8.2 at /usr/bin/ninja
WARNING: Running the setup command as `meson [options]` instead of `meson setup [options]` is ambiguous and deprecated.
然后
cd build
ninja
ninja install
这里就开始编译了,并安装到设置的目录。