编译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. xxx was built without full bitcode" 编译错误解决

    xxx was built without full bitcode" 编译错误解决 iOS 打包上线 All object files and libraries for bitcode ...

  2. Android studio2 中的 SDK Manager的使用-------Android SDK 的安装与更新(Install missing platform(s) and sync project 编译错误解决)

    最近在编写Android程序,其中有一个问题就是对旧应用的导入,此时往往你的Android SDK中并没有老版本的Android SDK, 此时往往会提示你出现错误 Install missing p ...

  3. qt在linux下引用x11库编译错误的解决办法

    首先安装x11的开发包,以debian9为例:sudo apt install xorg-dev这个解决.h头文件和.a库文件在qt的.pro文件中加入:LIBS += -lX11这个解决连接错误,注 ...

  4. 坑爹的gltools编译错误解决

    搭边手游,看opengl superbible, 书中代码需要一个gltools库.作者自己提供的code google地址里gltools项目是空的,此一坑. 他的网站(www.starstones ...

  5. 使用Crypto++库编译出错 解决办法

    错误信息: >------ 已启动生成: 项目: testCrypto++, 配置: Debug Win32 ------ >正在编译... >main.cpp >正在链接.. ...

  6. pip install leveldb 编译错误解决

    centos7,python3.3 # pip-python3 install leveldb 错误: /usr/include/python3.3m/dynamic_annotations.h:47 ...

  7. Linux上USB移植错误解决笔记

    在内核目录下先配置支持USB设备,无论你是什么设备,这一步都是必须的,USB驱动和其他的驱动不同,它分为USB设备驱动,另外还有USB-Host主机控制器的驱动,配置如下: Device Driver ...

  8. db2还原离线备份文件报错SQL2071N 提示“访问共享库出现错误”解决

    db2 buffers buffer 提示报错: SQL2071N  An error occurred while accessing the shared library  “/home/db2a ...

  9. swift 第三方库迁移错误解决“Use Legacy Swift Language Version” (SWIFT_VERSION) is required to be configured correctly for targets which use Swift. Use the [Edit > Convert > To Current Swift Syntax…] menu to choo

    先看看错误提示 这里Alamofire库报错,原因打开工程会Xcode会提示你覆盖到最新的3.0版本.但是仍然有些框架会出现一些问题 解决办法: 选择Pods - ReactiveCocoa - Sw ...

随机推荐

  1. O(n^2)以及O(nlogn)时间复杂度的排序算法

    O(n^2)的算法 都是做的升序. 简单选择排序 思路:每次选择还未排序的区间的最小值和未排序区间的第一个值交换. function selectSort(arr){ for(let i = 0; i ...

  2. io缓冲为何可以提高效率

    问题 据我了解,运用FileInputStream读写一段数据是一个字节一个字节的读取,如果有10个字节大小的文件,就要调用10次系统调用,每次将读取的数据赋值给变量,然后程序使用变量. 缓冲区可以看 ...

  3. 2017南宁现场赛E The Champion

    Bob is attending a chess competition. Now the competition is in the knockout phase. There are 2^r2r  ...

  4. AOP编程的常用实现方式

    aop代理分为静态代理.jdk动态代理.cglib动态代理 通过动态代理的方式实现横向扩展,实现权限校验.日志等功能. jdk静态代理:代理类和委托类实现同一接口,并且在代理类中需要硬编码接口. jd ...

  5. unity中绘制战争迷雾

    接上一篇中说的游戏,我们已经实现了client.host上的一个物体可见不可见的行为.之后我们可以加入类似检查两个单位之间的距离.或是两个单位之间有无阻挡物来进一步实现游戏机制. 在这篇随笔中我会首先 ...

  6. thinkphp 导入微信小程序加密解密库

    第三方类库 第三方类库指除了 ThinkPHP 框架.应用项目类库之外的其他类库,一般由第三方系统或产品提供,如 Smarty.Zend 等系统的类库等. 前面使用自动加载或 import 方法导入的 ...

  7. bzoj 2330 SCOI2011糖果 查分约束系统

    就根据题目中给的约束条件建图就行了 需要注意的是,我们要做的是最长路,因为需要约束每个点都是大于0 那么可以建一个超级源指向所有点,超级源的dis是1,边长为0 那么这样做最长路就可以了 好了我们这么 ...

  8. linux基础——磁盘分区和yum安装

    第一部分 1) 开启Linux系统前添加一块大小为15G的SCSI硬盘   2) 开启系统,右击桌面,打开终端   3) 为新加的硬盘分区,一个主分区大小为5G,剩余空间给扩展分区,在扩展分区上划分1 ...

  9. 如何重新签名ipa文件

    http://www.cocoachina.com/bbs/read.php?tid=185963 求ipa文件修改后重新打包的方法,我已经有开发者账号了. 替换了ipa里的图片后,就无法安装了,似乎 ...

  10. linux 链表实例应用程序【转】

    转自:http://blog.csdn.net/echo_qiang/article/details/6233057 /**************************************** ...