编译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.3