编译-glib交叉编译

2024-04-30 09:18
文章标签 编译 交叉 glib

本文主要是介绍编译-glib交叉编译,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        glib是一个C语言函数库,它对很多系统调用进行了封装,提供了很多实用的功能,能极大地方便编程。

        为了在产品上尝试使用glib,需要对glib进行交叉编译,使其能在ARM9上运行。

以下是版本信息:

        开发平台:Linux ubuntu 3.8.0-35-generic #52~precise1-Ubuntu SMP

        PC gcc 版本 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)

        ARM gcc version 4.1.2

        zlib-1.2.8

        libffi-3.2.1

        glib-2.45.3

        为了方便说明,先假设

1、zlib-1.2.8.tar.gz、libffi-3.2.1.tar.gz和glib-2.45.3.zip都已经解压到/home/user/build/目录下,分别是/home/user/build/zlib-1.2.8、/home/user/build/libffi-3.2.1和/home/user/build/glib-2.45.3。

2、CC是交叉编译器,根据自己的实际编译器而不同,这里CC最好时包含完整的路径。我这里是/opt/freescale/usr/local/gcc-4.1.2-glibc-2.5-nptl-3/arm-none-linux-gnueabi/bin/arm-none-linux-gnueabi-gcc

开始编译

1. 编译zlib,编译脚本如下:

cd /home/user/build/zlib-1.2.8
CC=/opt/freescale/usr/local/gcc-4.1.2-glibc-2.5-nptl-3/arm-none-linux-gnueabi/bin/arm-none-linux-gnueabi-gcc \
./configure --prefix=/home/user/build/zlib-1.2.8/install/arm/make
if [ $? == 0 ]; thenmake install
elseecho -e "\n\tmake fail\n"
fi

执行成功之后,zlib就会安装在/home/user/build/zlib-1.2.8/install/arm/目录

2. 编译libffi,编译脚本如下:

#!/bin/bash
cd /home/user/build/libffi-3.2.1
./configure --prefix=/home/huo/dbus/libffi-3.2.1/install/arm/ \
CC=/opt/freescale/usr/local/gcc-4.1.2-glibc-2.5-nptl-3/arm-none-linux-gnueabi/bin/arm-none-linux-gnueabi-gcc \
--host=arm-none-linux-gnueabi make
if [ $? == 0 ]; thenmake install
elseecho -e "\n\tmake fail\n"
fi

执行成功之后,zlib就会安装在/home/user/build/libffi-3.2.1/install/arm/目录

3. 下面编译glib,是个硬骨头,会有一些错误。

1)首先,glib需要一些配置,下面是一个配置文件glib.cache,这个配置文件需要放在/home/user/glib-2.45.3目录下面。

glib_cv_long_long_format=ll
glib_cv_stack_grows=no
glib_cv_have_strlcpy=no
glib_cv_have_qsort_r=yes
glib_cv_va_val_copy=yes
glib_cv_uscore=no
glib_cv_rtldglobal_broken=no
ac_cv_func_posix_getpwuid_r=yes
ac_cv_func_posix_getgrgid_r=yes

这个配置文件的选项,以及选项的意义看这里

https://developer.gnome.org/glib/stable/glib-cross-compiling.html

2)运行autogen.sh

#!/bin/bash
cd /home/user/build/glib-2.45.3
./autogen.sh

3)编译PC版glib

没错,你没看错,想交叉编译glib,需要先编译一个PC版本,而编译PC版glib又需要依赖PC版zlib和libffi

由于我使用的是ubuntu,所以直接sudo apt-get install libffi-dev就可以了,zlib系统已经带了

所以我编译PC版glib非常简单

#!/bin/bash
cd /home/user/build/glib-2.45.3
./configure --prefix=/home/usr/build/glib-2.45.3/install/pc --cache-file=glib.cache make
if [ $? == 0 ]; thenmake install
elseecho -e "\n\tmake fail\n"
fi

编译完成以后,就会在/home/usr/build/glib-2.45.3/install/pc/bin/目录下得到glib-genmarshal,否则在执行configure的时候会提示

configure: error: Could not find a glib-genmarshal in your PATH。至于为什么PC版就可以这个我还没有搞懂。

4)开始编译glib

#!/bin/bash
export PATH=$PATH:/home/huo/dbus/glib-2.45.3/install/pc/bin
cd /home/user/build/glib-2.45.3
./configure --prefix=/home/user/build/glib-2.45.3/install/arm \
CC=/opt/freescale/usr/local/gcc-4.1.2-glibc-2.5-nptl-3/arm-none-linux-gnueabi/bin/arm-none-linux-gnueabi-gcc  \
--host=arm-none-linux-gnueabi LIBFFI_CFLAGS="-I/home/user/build/libffi-3.2.1/install/lib/libffi-3.2.1/include" \
LIBFFI_LIBS="-lffi -L/home/user/build/libffi-3.2.1/install/lib" ZLIB_CFLAGS="-I/home/user/build/zlib-1.2.8/install/include" \
ZLIB_LIBS="-lz -L/home/user/build/zlib-1.2.8/install/lib" --cache-file=glib.cache \
--disable-selinux  --disable-xattr --disable-libelfmake
if [ $? == 0 ]; thenmake install
elseecho -e "\n\tmake fail\n"
fi


这时,make的时候就应该会出错,提示

CCLD gobject-query./.libs/libgobject-2.0.so: undefined reference to `ffi_type_pointer'

./.libs/libgobject-2.0.so: undefined reference to `ffi_type_float'

./.libs/libgobject-2.0.so: undefined reference to `ffi_type_void'

./.libs/libgobject-2.0.so: undefined reference to `ffi_type_sint64'

./.libs/libgobject-2.0.so: undefined reference to `ffi_prep_cif'

./.libs/libgobject-2.0.so: undefined reference to `ffi_type_uint32'

./.libs/libgobject-2.0.so: undefined reference to `ffi_type_double'

./.libs/libgobject-2.0.so: undefined reference to `ffi_call'

./.libs/libgobject-2.0.so: undefined reference to `ffi_type_sint32'

./.libs/libgobject-2.0.so: undefined reference to `ffi_type_uint64'

collect2: ld returned 1 exit status

这是由于没找到libffi.so的缘故。虽然我在配置里已经指定了libffi.so的路径,但glib就是死活找不到,暂时没找到解决方法,只能绕一下,把libffi.so libffi.so.6 libffi.so.6.0.4

复制到arm gcc的目录下,我这里的目录是/opt/freescale/usr/local/gcc-4.1.2-glibc-2.5-nptl-3/arm-none-linux-gnueabi/arm-none-linux-gnueabi/sysroot/lib。如果你不知道

你该复制到哪里,你可以在你的交叉编译器目录下找以下libc.so.*,比如find /opt/freescale -name libc.so.*,看libc.so.*放哪你就放哪。

同理,libz.so libz.so.1和libz.1.2.8也要拷贝到这个目录下。

后面继续make,又会弹出来一个错误

gfile.c:2749: error: too many arguments to function 'splice'

这个错误是跟系统以及编译器的版本有关系的。splice是一个系统调用,它的声明在交叉编译器的fcntl.h文件里的,但我这个编译器的splice只有4个参数,glib却传了6个参数。

这肯定不匹配嘛,没办法,只能修改glib-2.45.3目录下的config.h,把#define HAVE_SPLICE注释掉,这样就能编译过去了。至于影响,暂时还不清楚,这个splice是linux的

一个数据拷贝优化技术,可以减少数据的拷贝次数,提高系统效率,即使没有应该也是可以正常工作的。

再继续make,又蹦出来一个错误,我内心也是崩溃的

./.libs/libgio-2.0.so: undefined reference to `g_module_close'

./.libs/libgio-2.0.so: undefined reference to `g_module_symbol'

./.libs/libgio-2.0.so: undefined reference to `g_module_supported'

./.libs/libgio-2.0.so: undefined reference to `g_module_open'

./.libs/libgio-2.0.so: undefined reference to `g_module_error'

collect2: error: ld returned 1 exit status

这个错误又是没找到动态库,这次是没找到gmodule.so,需要修改gio/Makefile

找到glib_compile_resources_LDADD, gsettings_LDADD, gdbus_LDADD, gapplication_LDADD, gresource_LDADD这几个变量,在给每个变量都加上一句

$(top_builddir)/gmodule/libgmodule-2.0.la \

加上之后类似这样

gdbus_LDADD = libgio-2.0.la                 \
    $(top_builddir)/gobject/libgobject-2.0.la    \
    $(top_builddir)/gmodule/libgmodule-2.0.la    \
    $(top_builddir)/glib/libglib-2.0.la        \
    $(NULL)

再继续make。。。。。。。终于。。。。。。。

4. make install




 

这篇关于编译-glib交叉编译的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/948472

相关文章

maven 编译构建可以执行的jar包

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」👈,「stormsha的知识库」👈持续学习,不断总结,共同进步,为了踏实,做好当下事儿~ 专栏导航 Python系列: Python面试题合集,剑指大厂Git系列: Git操作技巧GO

Windows环境利用VS2022编译 libvpx 源码教程

libvpx libvpx 是一个开源的视频编码库,由 WebM 项目开发和维护,专门用于 VP8 和 VP9 视频编码格式的编解码处理。它支持高质量的视频压缩,广泛应用于视频会议、在线教育、视频直播服务等多种场景中。libvpx 的特点包括跨平台兼容性、硬件加速支持以及灵活的接口设计,使其可以轻松集成到各种应用程序中。 libvpx 的安装和配置过程相对简单,用户可以从官方网站下载源代码

Golang test编译使用

创建文件my_test.go package testsimport "testing"func TestMy(t *testing.T) {t.Log("TestMy")} 通常用法: $ go test -v -run TestMy my_test.go=== RUN TestMyTestMy: my_test.go:6: TestMy--- PASS: TestMy (0.

C++/《C/C++程序编译流程》

程序的基本流程如图:   1.预处理        预处理相当于根据预处理指令组装新的C/C++程序。经过预处理,会产生一个没有宏定义,没有条件编译指令,没有特殊符号的输出文件,这个文件的含义同原本的文件无异,只是内容上有所不同。 读取C/C++源程序,对其中的伪指令(以#开头的指令)进行处理将所有的“#define”删除,并且展开所有的宏定义处理所有的条件编译指令,如:“#if”、“

编译linux内核出现 arm-eabi-gcc: error: : No such file or directory

external/e2fsprogs/lib/ext2fs/tdb.c:673:29: warning: comparison between : In function 'max2165_set_params': -。。。。。。。。。。。。。。。。。。 。。。。。。。。。。。。。 。。。。。。。。 host asm: libdvm <= dalvik/vm/mterp/out/Inte

QT 编译报错:C3861: ‘tr‘ identifier not found

问题: QT 编译报错:C3861: ‘tr’ identifier not found 原因 使用tr的地方所在的类没有继承自 QObject 类 或者在不在某一类中, 解决方案 就直接用类名引用 :QObject::tr( )

hector_quadrotor编译总结 | ubuntu 16.04 ros-kinetic版本

hector_quadrotor编译总结 | ubuntu 16.04 ros-kinetic版本 基于Ubuntu 16.04 LTS系统所用ROS版本为 Kinetic hector_quadrotor ROS包主要用于四旋翼无人机的建模、控制和仿真。 1.安装依赖库 所需系统及依赖库 Ubuntu 16.04|ros-kinetic|Gazebo|gazebo_ros_pkgs|ge

hector_quadrotor编译总结 | ubuntu 14.04 ros-indigo版本

hector_quadrotor编译总结 | ubuntu 14.04 ros-indigo版本 基于Ubuntu 14.04 LTS系统所用ROS版本为 Indigo hector_quadrotor ROS包主要用于四旋翼无人机的建模、控制和仿真。 备注:两种安装方式可选:install the binary packages | install the source files

编译和链接那点事下

http://www.0xffffff.org/?p=357 上回书我们说到了链接以前,今天我们来研究最后的链接问题。         链接这个话题延伸之后完全可以跑到九霄云外去,为了避免本文牵扯到过多的话题导致言之泛泛,我们先设定本文涉及的范围。我们今天讨论只链接进行的大致步骤及其规则、静态链接库与动态链接库的创建和使用这两大块的问题。至于可执行文件的加载、可执行文件的运行时

编译和链接那点事上

http://www.0xffffff.org/?p=323  有位学弟想让我说说编译和链接的简单过程,我觉得几句话简单说的话也没什么意思,索性写篇博文稍微详细的解释一下吧。其实详细的流程在经典的《Linkers and Loaders》和《深入理解计算机系统》中均有描述,也有国产的诸如《程序员的自我修养——链接、装载与库》等大牛著作。不过,我想大家恐怕很难有足够的时间去研读这些厚如