编译Linux下的库是一件痛苦的事情,这里主要阐述glib和wpa_supplicant库的编译,因各自的依赖关系,另外一些库要事先编译。glib依赖libffi和zlib,而wpa_supplicant依赖dbus和openssl。
总结下交叉编译几个常见的逻辑:
1. 指定CC为交叉编译器
2. 指定--prefix,如果不指定,会将宿主机PC上相应的库给覆盖了,如果是系统关键的库文件,那就会造成系统启动失败。解决办法只有一个一个找到被覆盖的文件,再从一台好的PC机上拷贝回来。注意这里要找到被修改的文件不是那么容易,也许只有看文件的修改日期,另要找到一台相同系统的机器也不是那么简单的。
3. 编译依赖其他库的package的时候(这里就是glib,它依赖libffi和zlib),要将依赖库的lib和include路径指定清楚,让编译器能够找到这些文件,如果头文件include找不到的话,那就会编译出错,报not found file or directory之类的错误;如果是库文件lib找不到的话,那就会在ld链接的时候出错,报undefined function之类的错误。
4. pkg-config和PKG_CONFIG_PATH的使用,网上已经有很详细的介绍了,这里不再细数。只是说明尽量用pkgconfig方式来指定依赖库和头文件的路径,在*.pc文件里面已经有很详细的定义,就不用在configure或者make的时候指定一串串长长的CFLAGS,LDFLAGS,-I,-L。
5. 在定义CFLAGS或者LDFLAGS的时候,尽量不要指定PC系统的目录,像/usr/lib,/usr/include之类。因为系统一般都是x86的库,如果被交叉编译的库链接的话会报错。
编译历程:
1. 需定义LIBFFI_LIBS, LIBFFI_CFLAGS, ZLIB_LIBS和ZLIB_CFLAGS这几个宏,否则会出现一下的错误。
make[4]: Entering directory `/home/joe/Downloads/glib-2.32.4/gobject'
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
make[4]: *** [gobject-query] Error 1
make[4]: Leaving directory `/home/joe/Downloads/glib-2.32.4/gobject'
make[3]: *** [all-recursive] Error 1
make[3]: Leaving directory `/home/joe/Downloads/glib-2.32.4/gobject'
make[2]: *** [all] Error 2
make[2]: Leaving directory `/home/joe/Downloads/glib-2.32.4/gobject'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/home/joe/Downloads/glib-2.32.4'
make: *** [all] Error 2

2. 需编译安装libffi,否则会出现一下的错误:
configure: error: Package requirements (libffi >= 3.0.0) were not met:
No package 'libffi' found
Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.

3. 将PC上编译出来的glib-compile-schemas拷贝到交叉编译的glib代码目录下面,否则会提示找不到glib-compile-schemas的错误:

./configure: glib-compile-schemas not found

这个问题挺奇怪,既然要编译glib,竟然还要先在PC上编译一个glib,然后编第二次使用第一次边出来的bin文件。 http://www.spinics.net/lists/gtk/msg17208.html这个patch在这里做一个记录。

4. 定义linux-arm.cache文件作为参数--cache-file的值,手工指定:不能为交叉编译检查glib_cv_stack_grow, 应为交叉编译在PC上,不在板子里。类似其他一些值写进去,否则会有类似下面的错误:
checking for growing stack pointer...configure: error: cannot run test program while cross compiling

修改内容如下:
echo ac_cv_type_long_long=yes>$ARCH-linux.cache
echo glib_cv_stack_grows=no>>$ARCH-linux.cache
echo glib_cv_uscore=no>>$ARCH-linux.cache
echo ac_cv_func_posix_getpwuid_r=yes>>$ARCH-linux.cache

5. 在CFLAGS中指定-Wl,-rpath $(DESTDIR)/../obj/external/glib/gmodule/.libs/,否则会出现找不到gmodule.so的库文件的错误:
gmodule.so not found

glib编译过程中会引用先前编译出来的库文件,然而竟然没有找到,find了一下发现在make install之前这个库的位置,故而用-Wl -rpath在指定。

6. 编译openssl需要定义no-asm和shared,去掉-m64,否则会出现编译汇编失败和编译器不识别-m64的错误。
7. 编译wpa_supplicant需要禁止掉nl80211的编译,否则会提示错误:
netlink/genl/genl.h: No such file or directory

如果指定系统/usr/include目录给CFLAGS,以提示genl.h的位置,这个问题是没有了,会出现其他问题,提示__asm__错误,原来定义/usr/include之后,有些头文件就到这个目录下去找,也就是找x86的头文件,这和arm的不兼容,故出现问题。也就是上面描述的总结5。

总结:
有时候编译UNIX库并没有想象中的那么简单,configure&make&make install永远不会是所有的过程,不同PC不同编译器会碰到不同的问题,在此做记录,与大家共勉。




glib wpa_supplicant Unix上库编译错误解决与总结相关推荐

  1. unity引用动态库的错误解决办法

    unity引用动态库的错误解决办法 引用动态库的错误 引用其他类库程序集 .NET Standard 2.0 配置文件 .NET 4.x 配置文件 引用动态库的错误 旧版unity编写的程序使用新版u ...

  2. wordpress上传主题错误解决方法

    wordpress上传主题错误解决方法 一.登录wordpress管理后台 二.上传主题包 三.上传主题包报错 四.生成php.ini文件 1.进入wordpress容器 2.复制php.ini文件 ...

  3. java telephony jar_编译错误解决方法

    首页板块列表刷机技术阅读帖子 编译错误解决方法 发布时间:2015-05-19 18:153回复.2072阅读 前言:关于Android4.4/CM11编译中遇到的一些错误,本人进行了整理.有需要的童 ...

  4. adt编译和candle编译错误解决

    adt编译和candle编译错误解决 错误一:adt编译报错 Could not generate timestamp: Software caused connection abort: recv ...

  5. Arduino编译错误解决办法:fork/exec:…\arm-none-eabi-g++.exe: The filename or extension is too long

    编译错误解决办法:fork/exec:-\arm-none-eabi-g++.exe: The filename or extension is too long 解决方案来自Edge Impulse ...

  6. Error: illegal character: '\u200b'编译错误解决方法

    Error: illegal character: '\u200b' 编译错误如下 错误原因 此类错误关注这个错误的字符--'\u200b' '\u200b'表示为zero-width-space,以 ...

  7. mpalyer 编译错误解决办法

    错误(1) ./codec-cfg ./etc/codecs.conf > codecs.conf.h ./codec-cfg: 1: Syntax error: word unexpected ...

  8. 【安装win7 64位系统】- 出现《Windows安装程序无法将Windows配置为在此计算机的硬件上运行》错误-解决方法

    安装win7 64位系统出现<Windows安装程序无法将Windows配置为在此计算机的硬件上运行>错误的解决方法 出现的原因 解决办法 分割线:以下为查找的资料 博主用U盘安装台式wi ...

  9. machoview github原版下载后编译错误解决方法,附能编译的源码下载

    文章目录 错误:unable to find sdk 'macosx10.9' 错误:'string' file not found 错误:'capstone.h' file not found wi ...

  10. 最方便的方法8192EU无线网卡在ubuntu14.04下驱动编译错误解决

    亏爹的intel 7260网卡,一直断线,只能用usb的网卡.网上买了两个,发现驱动都太旧了,编译不过,改了一下代码,可以用了. ps:有的网卡linux自带驱动,但会断线,也可以编译一下驱动试试. ...

最新文章

  1. 如何实现有效的团队管理?
  2. js 外部文件加载处理
  3. Java传xml时字符串乱码_大神们,我用DOM4j解析xml文档时,中文乱码
  4. boost::multiprecision模块hash相关的测试程序
  5. HTML编码问题导致的乱码
  6. tomcat安装与项目部署
  7. 计算机网络(二十四)-路由算法及路由协议
  8. pytorch torch.nn.RNN
  9. [基础]sizeof和strlen
  10. java jlabel 字体大小_java – 如何在调整大小时更改JLabel字体大小以填充JPanel可用空间?...
  11. opencart china 书籍主题
  12. DAS、NAS、SAN三种高端存储技术分析
  13. mysql远程操作权限(navicat for mysql)
  14. 青少年编程Playgrounds之十八--算法
  15. 多线程 join 钉钉考勤
  16. 深圳计算机专业中专学校,深圳中专学校
  17. 数组的正负数分割排序
  18. 七层/四层网络模型对应协议
  19. 关于辽大信息学院选导师的一点儿心得
  20. openssl制作证书全过程

热门文章

  1. 语音识别系统原理介绍----gmm-hmm
  2. HDU - 2602(动态规划,01背包问题)
  3. java 下拉框带搜索功能_java简单的实现搜索框的下拉显示相关搜索功能
  4. 217.存在重复元素 (力扣leetcode) 博主可答疑该问题
  5. java注释符_Java程序中的单行注释符是(  ),多行注释符是( )。
  6. win10计算机信息更改图,Win10系统怎么修改通知信息的位置【图文】
  7. JSONP原理及使用
  8. 【代码笔记】Web-JavaScript-JavaScript 运算符
  9. Spring 依赖注入中 Field 注入的有害性
  10. c#的装箱和拆箱及值类型和引用类型