关闭

glib交叉编译

051人阅读 评论 (0) 收藏 举报
分类:
转自:


http://blog.csdn.net/ty3219/article/details/46942493

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

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

以下是版本信息:

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

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

ARM gcc version 0.1.2

zlib-1.2.8

libffi-3.2.1

glib-2.45.3


为了方便说明,先假设

0、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。

0、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


开始编译

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

  1. cd /home/user/build/zlib-1.2.8
  2. CC=/opt/freescale/usr/local/gcc-4.1.2-glibc-2.5-nptl-3/arm-none-linux-gnueabi/bin/arm-none-linux-gnueabi-gcc \
  3. ./configure --prefix=/home/user/build/zlib-1.2.8/install/arm/
  4. make
  5. if [ $?==0 ]; then
  6. make install
  7. else
  8. echo -e "\n\tmake fail\n"
  9. fi

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


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

  1. #!/bin/bash
  2. cd /home/user/build/libffi-3.2.1
  3. ./configure --prefix=/home/huo/dbus/libffi-3.2.1/install/arm/ \
  4. CC=/opt/freescale/usr/local/gcc-4.1.2-glibc-2.5-nptl-3/arm-none-linux-gnueabi/bin/arm-none-linux-gnueabi-gcc \
  5. --host=arm-none-linux-gnueabi
  6. make
  7. if [ $?==0 ]; then
  8. make install
  9. else
  10. echo -e "\n\tmake fail\n"
  11. fi

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


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

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

  1. glib_cv_long_long_format=ll
  2. glib_cv_stack_grows=no
  3. glib_cv_have_strlcpy=no
  4. glib_cv_have_qsort_r=yes
  5. glib_cv_va_val_copy=yes
  6. glib_cv_uscore=no
  7. glib_cv_rtldglobal_broken=no
  8. ac_cv_func_posix_getpwuid_r=yes
  9. ac_cv_func_posix_getgrgid_r=yes

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

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


0)运行autogen.sh

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



0)编译PC版glib

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

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

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

  1. #!/bin/bash
  2. cd /home/user/build/glib-2.45.3
  3. ./configure --prefix=/home/usr/build/glib-2.45.3/install/pc --cache-file=glib.cache
  4. make
  5. if [ $?==0 ]; then
  6. make install
  7. else
  8. echo -e "\n\tmake fail\n"
  9. 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版就可以这个我还没有搞懂。


0)开始编译glib

  1. #!/bin/bash
  2. export PATH=$PATH:/home/huo/dbus/glib-2.45.3/install/pc/bin
  3. cd /home/user/build/glib-2.45.3
  4. ./configure --prefix=/home/user/build/glib-2.45.3/install/arm \
  5. CC=/opt/freescale/usr/local/gcc-4.1.2-glibc-2.5-nptl-3/arm-none-linux-gnueabi/bin/arm-none-linux-gnueabi-gcc \
  6. --host=arm-none-linux-gnueabi LIBFFI_CFLAGS="-I/home/user/build/libffi-3.2.1/install/lib/libffi-3.2.1/include" \
  7. 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" \
  8. ZLIB_LIBS="-lz -L/home/user/build/zlib-1.2.8/install/lib" --cache-file=glib.cache \
  9. --disable-selinux --disable-xattr --disable-libelf
  10. make
  11. if [ $?==0 ]; then
  12. make install
  13. else
  14. echo -e "\n\tmake fail\n"
  15. 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 0 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 0 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。。。。。。。终于。。。。。。。


0. make install

0
0

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问: 073474次
    • 积分: 0965
    • 等级: http://blog.csdn.net/
    • 排名: 第2551名
    • 原创: 069篇
    • 转载: 092篇
    • 译文: 0篇
    • 评论: 06条
    文章分类
    最新评论

makubuki1976.xsl.pt zurikuse1987.xsl.pt paien1970.xsl.pt видео зима мороз скачать | скачать кликеры для буксов | скачать приколи на звоной | музыку скачать без регистрации | www.программа телеграф скачать | карта сайта | скачать анимашки с рождеством | секреты быстрого плавания скачать | скачать дан балан2015 | карта сайта | скачать вк для 2.3.5 | скачать террарию 2016 | скачать вибер версия 4.0 | скачать биос hd7790 | скачать человека паука 5 | чек эксемель скачать | скачать клим | нотная библиотека скачать ноты | карта сайта | скачать песню группы непара | карта экибастуза скачать | рингтон скачать otherwise morcheeba | скачать зет 7 | скачать виспер на андроид главная rss sitemap html link