构建交叉编译的glib应用开发环境和运行环境。
$ cat /proc/version
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 --version
GNU Make 4.1
为 x86_64-pc-linux-gnu 编译
Copyright (C) 1988-2014 Free Software Foundation, Inc.
许可证:GPLv3+:GNU 通用公共许可证第 3 版或更新版本<http://gnu.org/licenses/gpl.html>。
本软件是自由软件:您可以自由修改和重新发布它。
在法律允许的范围内没有其他保证。
地址: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
lkmao@ubuntu:~/tool$ wget https://mirrors.ustc.edu.cn/gnome/sources/glib/2.8/glib-2.8.6.tar.bz2
--2022-09-08 00:38:35-- https://mirrors.ustc.edu.cn/gnome/sources/glib/2.8/glib-2.8.6.tar.bz2
正在解析主机 mirrors.ustc.edu.cn (mirrors.ustc.edu.cn)... 202.141.160.110, 2001:da8:d800:95::110
正在连接 mirrors.ustc.edu.cn (mirrors.ustc.edu.cn)|202.141.160.110|:443... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度: 2691171 (2.6M) [application/octet-stream]
正在保存至: “glib-2.8.6.tar.bz2”
glib-2.8.6.tar.bz2 100%[======================================================================================================================================================================>] 2.57M --.-KB/s 用时 0.1s
2022-09-08 00:38:35 (24.0 MB/s) - 已保存 “glib-2.8.6.tar.bz2” [2691171/2691171])
lkmao@ubuntu:~/tool$
第一步:
这个真的很长,我的编译器的路径是/home/lkmao/tool/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf。
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指定的目录
#include <glib.h>
int main(void)
{
g_print("Hello, world!\n");
return 0;
}
先说两个可能遇到的问题
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如下所示:
LINK_INCLUDE += -I/home/lkmao/tool/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/include/glib-2.0/
LINK_INCLUDE += -I/home/lkmao/tool/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/lib/glib-2.0/include
CC=/home/lkmao/tool/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc
LINK_LIB += -L/home/lkmao/tool/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/lib
app:
$(CC) main.c $(LINK_LIB) -lglib-2.0 $(LINK_INCLUDE) -o app
.PHONY:clean
clean:
rm -f *.o app
执行效果如下所示:
$ make
/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
$
稍微解释一下:
-L 后接链接的库的路径
-l(小写L) 后接链接的库的名字,例如库的实际名字是libabc.so,那么-l 后面就接abc。去掉lib三个字母。
-I(大写i) 后接头文件的路径,本次编译指定的两个头文件路径,所以加了两次-Ixxx;
$ file app
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
$
ok,验证没问题,是ARM格式的app。
在板子上执行一下,如果成功了,说明根文件系统中有相关的库,如果执行失败,将提示缺少的库文件从交叉编译工具安装路径复制过去。
在板子上运行,输出OK。
# ./app
Hello, world!
记得上次交叉编译glib,要先安装好多依赖的库,这次竟然一次通过了。真是幸福来的太突然了。