• 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,这里直接照抄

    1. [properties]
    2. pkg_config_libdir = ['/home/alientek/Desktop/arm_lib/lib/pkgconfig']
    3. [binaries]
    4. c = 'arm-none-linux-gnueabihf-gcc'
    5. cpp = 'arm-none-linux-gnueabihf-g++'
    6. ar = 'arm-none-linux-gnueabihf-ar'
    7. strip = 'arm-none-linux-gnueabihf-strip'
    8. pkgconfig = 'pkg-config'
    9. [host_machine]
    10. system = 'linux'
    11. cpu_family = 'arm'
    12. cpu = 'ARM9'
    13. endian = 'little'
    14. [build_machine]
    15. system = 'linux'
    16. cpu_family = 'x86_64'
    17. cpu = 'i686'
    18. endian = 'little'

    pkg_config_libdir是pkg的配置目录,这里写的是我的交叉编译pkg配置目录。

    arm-none-linux-gnueabihf-*这些是交叉编译链的命令,如果使用的是其他交叉编译链,这里需要根据对应的编译链名字配置。

    host_machine部分是你的芯片配置,需要根据具体芯片配置了。

    配置之后就可以开始用meson配置了,但是不要使用ubuntu下载的meson。因为Ubuntu下载的meson版本低,会导致编译报错

    1. alientek@ubuntu18:~/Desktop/threelibrary/test/glib-2.78.0$ meson -v
    2. 0.45.1
    3. 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
    4. The Meson build system
    5. Version: 0.45.1
    6. Source dir: /home/alientek/Desktop/threelibrary/test/glib-2.78.0
    7. Build dir: /home/alientek/Desktop/threelibrary/test/glib-2.78.0/build
    8. Build type: cross build
    9. meson.build:15:13: ERROR: lexer
    10. c_standards = {}
    11. ^
    12. 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默认调用命令,

    1. alientek@ubuntu18:~/Desktop/threelibrary/test/glib-2.78.0$ python3
    2. Python 3.6.5 (default, Dec 9 2021, 17:04:37)
    3. [GCC 8.4.0] on linux
    4. Type "help", "copyright", "credits" or "license" for more information.
    5. >>> quit()

    表明默认的python3命令调用的是python3.6,此时你的电脑中已经同时拥有3.6和3.7版本了,需要重新配置。

    配置命令如下:

    1. sudo update-alternatives --list python
    2. sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.7 1
    3. sudo update-alternatives --list python
    4. 输出
    5. /usr/bin/python3.7

    此时你再调用python3用的就是3.7了

    安装meson

    1. alientek@ubuntu18:~/Desktop/threelibrary/test/glib-2.78.0$ pip3 install meson
    2. Collecting meson
    3. Using cached https://files.pythonhosted.org/packages/b0/74/73a0d5264f04c9193d2d588400ae913a167911b4342320cbdde3040b753d/meson-1.2.3-py3-none-any.whl
    4. Installing collected packages: meson
    5. 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文件夹中,然后重新执行。

    1. Looking for a fallback subproject for the dependency libpcre2-8
    2. Downloading pcre2 source from https://github.com/PhilipHazel/pcre2/releases/download/pcre2-10.42/pcre2-10.42.tar.bz2
    3. WARNING: failed to download with error: The read operation timed out. Trying after a delay...
    4. <urlopen error [Errno 111] Connection refused>
    5. 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...
    6. <urlopen error [Errno 111] Connection refused>
    7. 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...
    8. <urlopen error [Errno 111] Connection refused>
    9. 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...
    10. <urlopen error [Errno 111] Connection refused>
    11. 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...
    12. <urlopen error [Errno 111] Connection refused>
    13. A fallback URL could be specified using source_fallback_url key in the wrap file
    14. 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?
    15. A full log can be found at /home/alientek/Desktop/threelibrary/test/glib-2.78.0/build/meson-logs/meson-log.txt

     下载正确之后

    1. glib 2.78.0
    2. Build environment
    3. host cpu : arm
    4. host endian : little
    5. host system : linux
    6. C Compiler : gcc
    7. C++ Compiler : gcc
    8. shared build : True
    9. static build : False
    10. Directories
    11. prefix : /home/alientek/Desktop/arm_lib
    12. bindir : /home/alientek/Desktop/arm_lib/bin
    13. libexecdir : /home/alientek/Desktop/arm_lib/libexec
    14. pkgdatadir : /home/alientek/Desktop/arm_lib/share/glib-2.0
    15. datadir : /home/alientek/Desktop/arm_lib/share
    16. includedir : /home/alientek/Desktop/arm_lib/include/glib-2.0
    17. giomodulesdir : /home/alientek/Desktop/arm_lib/lib/gio/modules
    18. localstatedir : /home/alientek/Desktop/arm_lib/var
    19. runstatedir : /run
    20. Options
    21. selinux : False
    22. libmount : False
    23. xattr : False
    24. man : False
    25. dtrace : False
    26. systemtap : False
    27. sysprof : False
    28. gtk_doc : False
    29. bsymbolic_functions: True
    30. force_posix_threads: False
    31. tests : True
    32. installed_tests : False
    33. nls : auto
    34. oss_fuzz : disabled
    35. glib_debug : auto
    36. glib_assert : True
    37. glib_checks : True
    38. libelf : disabled
    39. multiarch : False
    40. Subprojects
    41. gvdb : YES
    42. User defined options
    43. Cross files : cross_file.txt
    44. prefix : /home/alientek/Desktop/arm_lib
    45. dtrace : false
    46. installed_tests : false
    47. libelf : disabled
    48. libmount : disabled
    49. selinux : disabled
    50. systemtap : false
    51. Found ninja-1.8.2 at /usr/bin/ninja
    52. WARNING: Running the setup command as `meson [options]` instead of `meson setup [options]` is ambiguous and deprecated.

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

    然后

    1. cd build
    2. ninja
    3. ninja install

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

  • 相关阅读:
    Golang 并发编程
    常见的 NoSQL 数据库有哪些?
    深度访谈丨工作13年的程序员老兵,当初为何选择Java?现在后悔吗?
    系统编程:互斥锁,条件变量
    rysnc 通过文件输入密码的设置方法
    22【解释器设计模式】
    C专家编程 第9章 再论数组 9.2 为什么会发生混淆
    一号店按关键字搜索yhd商品 API 返回值说明
    置换环建笛卡尔树:AT_wtf22Day1B
    rknn_yolov5执行流程
  • 原文地址:https://blog.csdn.net/andylauren/article/details/134068645