• glib编程2:交叉编译glib库并测试


    前言

            构建交叉编译的glib应用开发环境和运行环境。

            我的开发环境

                    系统版本

    1. $ cat /proc/version
    2. Linux version 5.4.0-84-generic (buildd@lcy01-amd64-007) (gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)) #94~18.04.1-Ubuntu SMP Thu Aug 26 23:17:46 UTC 2021

                    make版本

    1. $ make --version
    2. GNU Make 4.1
    3. 为 x86_64-pc-linux-gnu 编译
    4. Copyright (C) 1988-2014 Free Software Foundation, Inc.
    5. 许可证:GPLv3+:GNU 通用公共许可证第 3 版或更新版本
    6. 本软件是自由软件:您可以自由修改和重新发布它。
    7. 在法律允许的范围内没有其他保证。

    一 下载源码

    地址:https://download.gnome.org/sources/glib/

    我下载的是glib-2.8.6.tar.bz2。

    wget https://mirrors.ustc.edu.cn/gnome/sources/glib/2.8/glib-2.8.6.tar.bz2
    1. lkmao@ubuntu:~/tool$ wget https://mirrors.ustc.edu.cn/gnome/sources/glib/2.8/glib-2.8.6.tar.bz2
    2. --2022-09-08 00:38:35-- https://mirrors.ustc.edu.cn/gnome/sources/glib/2.8/glib-2.8.6.tar.bz2
    3. 正在解析主机 mirrors.ustc.edu.cn (mirrors.ustc.edu.cn)... 202.141.160.110, 2001:da8:d800:95::110
    4. 正在连接 mirrors.ustc.edu.cn (mirrors.ustc.edu.cn)|202.141.160.110|:443... 已连接。
    5. 已发出 HTTP 请求,正在等待回应... 200 OK
    6. 长度: 2691171 (2.6M) [application/octet-stream]
    7. 正在保存至: “glib-2.8.6.tar.bz2”
    8. glib-2.8.6.tar.bz2 100%[======================================================================================================================================================================>] 2.57M --.-KB/s 用时 0.1s
    9. 2022-09-08 00:38:35 (24.0 MB/s) - 已保存 “glib-2.8.6.tar.bz2” [2691171/2691171])
    10. lkmao@ubuntu:~/tool$

    二 编译

    第一步:

    这个真的很长,我的编译器的路径是/home/lkmao/tool/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf。

    1. CC=/home/lkmao/tool/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc ./configure --host=arm-linux-gnueabihf --prefix=/home/lkmao/tool/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin glib_cv_stack_grows=no glib_cv_uscore=no ac_cv_func_posix_getpwuid_r=yes ac_cv_func_posix_getgrgid_r=yes ac_cv_lib_rt_clock_gettime=no glib_cv_monotonic_clock=yes

    第二步make

    make

    第三步 make install

    这是安装的目录是--prefix指定的目录

    三 编写hello world

    1 代码

    1. #include
    2. int main(void)
    3. {
    4. g_print("Hello, world!\n");
    5. return 0;
    6. }

    2 makefile文件

    先说两个可能遇到的问题

    1)找不到库,在用-L添加库的路径,如下所示,就是--prefix的路径+lib。

    -L/home/lkmao/tool/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/lib

    2)找不到头文件,就是--prefix的路径+/include/glib-2.0/和+/include/glib-2.0/include

    或者直接在--prefix路径下搜索。

    修改好的Makefile如下所示:

    1. LINK_INCLUDE += -I/home/lkmao/tool/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/include/glib-2.0/
    2. LINK_INCLUDE += -I/home/lkmao/tool/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/lib/glib-2.0/include
    3. CC=/home/lkmao/tool/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc
    4. LINK_LIB += -L/home/lkmao/tool/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/lib
    5. app:
    6. $(CC) main.c $(LINK_LIB) -lglib-2.0 $(LINK_INCLUDE) -o app
    7. .PHONY:clean
    8. clean:
    9. rm -f *.o app

    开始编译make

    执行效果如下所示:

    1. $ make
    2. /home/lkmao/tool/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc main.c -L/home/lkmao/tool/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/lib -lglib-2.0 -I/home/lkmao/tool/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/include/glib-2.0/ -I/home/lkmao/tool/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/lib/glib-2.0/include -o app
    3. $

    稍微解释一下:

    -L 后接链接的库的路径

    -l(小写L) 后接链接的库的名字,例如库的实际名字是libabc.so,那么-l 后面就接abc。去掉lib三个字母。

    -I(大写i) 后接头文件的路径,本次编译指定的两个头文件路径,所以加了两次-Ixxx;

    file验证

    1. $ file app
    2. app: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 2.6.31, BuildID[sha1]=5b8fe8cb8c727f5352889a32b14c6600c84486e7, with debug_info, not stripped
    3. $

    ok,验证没问题,是ARM格式的app。

    执行

            在板子上执行一下,如果成功了,说明根文件系统中有相关的库,如果执行失败,将提示缺少的库文件从交叉编译工具安装路径复制过去。

    在板子上运行,输出OK。

    1. # ./app
    2. Hello, world!

    总结

            记得上次交叉编译glib,要先安装好多依赖的库,这次竟然一次通过了。真是幸福来的太突然了。

  • 相关阅读:
    spacy的每个词token的所有属性
    【计算机网络:自顶向下方法】(二)应用层
    深度学习进行图像识别:技术详解与实践
    迅为RK3588开发板使用 tflite 框架
    序列化-反序列化--json-xml-protoBuf
    android recyclerView緩存數量 recycleview的缓存
    云原生精品资料合集(附下载)
    网友咨询:手机卡套餐可以换成流量卡套餐吗?说一说改套餐的问题!
    【C++】-- 继承
    丁鹿学堂:promise深入解读(一)
  • 原文地址:https://blog.csdn.net/yueni_zhao/article/details/126765391