编译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. php CI框架基础知识

    一. CI框架的MVC导图 二. CI框架目录文件介绍 (1)index.php  单入口         整个框架对外暴露的唯一访问文件 (2)application  应用文件(放置用户信息,用户 ...

  2. JVM 性能排查--查看哪个对象占用内存大

    参考:http://blog.csdn.net/chenleixing/article/details/44227327/ 1.  在IE地址栏中输入:http://localhost/test/in ...

  3. codevs 3305 水果姐逛水果街Ⅱ&&codevs3006

    题目描述 Description 水果姐第二天心情也很不错,又来逛水果街. 突然,cgh又出现了.cgh施展了魔法,水果街变成了树结构(店与店之间只有一条唯一的路径). 同样还是n家水果店,编号为1~ ...

  4. 会议中心[APIO2009]

    会议中心 思路 这一题的正解是倍增的,但是由于我太蒟蒻了,所以我选了一个不算正解但是有可以拿满分的题目学习 思路和我考场上其实差不多,只是我无法实现.... 下面我先来介绍几个数组的用途 1.s,s数 ...

  5. POJ1236 (强连通分量缩点求入度为0和出度为0的分量个数)

    Network of Schools Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 13804   Accepted: 55 ...

  6. C++格式输出控制

    #include<iostream> #include<string> #include<vector> #include<set> #include& ...

  7. linux coredump测试

    1 )如何生成 coredump 文件 ? 登陆 LINUX 服务器,任意位置键入 echo "ulimit -c 1024" >> /etc/profile 退出 L ...

  8. JAVA中“==”和equals

     A."=="可用于基本类型和引用类型: 当用于基本类型时候,是比较值是否相同:1==2: false: 当用于引用类型的时候,是比较是否指向同一个对象.  B.基本类型int.c ...

  9. 【 总结 】linux中test命令详解

    test命令在bash shell脚本中经常以中括号([])的形式出现,而且在脚本中使用字母来表示比符号表示更专业,出错率更低. 测试标志 代表意义 文件名.文件类型 -e 该文件名是否存在 -f 该 ...

  10. SFTP获取数据文件

    使用SFTP:客户端从服务端获取数据文件 客户机: 用户:client IP:13.00.00.11 服务端: 用户:server IP:16.00.00.66 1.在客户端的根目录下,执行下面的命令 ...