glib-2.78.0交叉编译

编译机版本: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.org)这里下载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 build

meson.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 meson
  Using cached https://files.pythonhosted.org/packages/b0/74/73a0d5264f04c9193d2d588400ae913a167911b4342320cbdde3040b753d/meson-1.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 https://github.com/PhilipHazel/pcre2/releases/download/pcre2-10.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 https://github.com/PhilipHazel/pcre2/releases/download/pcre2-10.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 https://github.com/PhilipHazel/pcre2/releases/download/pcre2-10.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 https://github.com/PhilipHazel/pcre2/releases/download/pcre2-10.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 https://github.com/PhilipHazel/pcre2/releases/download/pcre2-10.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 file

meson.build:2103:10: ERROR: could not get https://github.com/PhilipHazel/pcre2/releases/download/pcre2-10.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.0

  Build environment
    host cpu           : arm
    host endian        : little
    host system        : linux
    C Compiler         : gcc
    C++ Compiler       : gcc
    shared build       : True
    static build       : False

  Directories
    prefix             : /home/alientek/Desktop/arm_lib
    bindir             : /home/alientek/Desktop/arm_lib/bin
    libexecdir         : /home/alientek/Desktop/arm_lib/libexec
    pkgdatadir         : /home/alientek/Desktop/arm_lib/share/glib-2.0
    datadir            : /home/alientek/Desktop/arm_lib/share
    includedir         : /home/alientek/Desktop/arm_lib/include/glib-2.0
    giomodulesdir      : /home/alientek/Desktop/arm_lib/lib/gio/modules
    localstatedir      : /home/alientek/Desktop/arm_lib/var
    runstatedir        : /run

  Options
    selinux            : False
    libmount           : False
    xattr              : False
    man                : False
    dtrace             : False
    systemtap          : False
    sysprof            : False
    gtk_doc            : False
    bsymbolic_functions: True
    force_posix_threads: False
    tests              : True
    installed_tests    : False
    nls                : auto
    oss_fuzz           : disabled
    glib_debug         : auto
    glib_assert        : True
    glib_checks        : True
    libelf             : disabled
    multiarch          : False

  Subprojects
    gvdb               : YES

  User defined options
    Cross files        : cross_file.txt
    prefix             : /home/alientek/Desktop/arm_lib
    dtrace             : false
    installed_tests    : false
    libelf             : disabled
    libmount           : disabled
    selinux            : disabled
    systemtap          : false

Found 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.

其中有一些编译选项可以在使用meson命令时添加进去,比如生成doc,可以添加-Dgtk_doc=true

然后

cd build
ninja
ninja install

这里就开始编译了,并安装到设置的目录。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值