嵌入式 交叉编译DirectFB以及交叉编译configure详解

由于第一次搞嵌入式,交叉编译DirectFB费了一些周折。

 

首先记录下编译的过程

 

 

1准备源文件包,下载freetype2.4.4和DirectFB-1.4.11.tar.gz,解压。

 

2 交叉编译安装freetype

 

 exportCC=arm-none-linux-gnueabi-gcc

 

 指定交叉编译器。(我用的交叉编译器来自sourceG++) 

 

 ./configure--host=arm-linux --prefix=/opt/freetype/

 make

 makeinstall

 

freetype安装完毕

 

3 交叉编译directfb

 

 exportLDFLAGS=-L/opt/freetype/lib
 export CFLAGS="-g -I/opt/freetype/include"
 ./configure --host=arm-linux --prefix=$PREFIX--with-gfxdrivers=none --with-inputdrivers=all --disable-png--disable-jpeg --disable-zlib --enable-sdl=no --enable-gif=no--disable-x11
 make
 make install

 交叉编译directfb完毕。

 

4 修改/etc/bash.bashrc把新安装的库的路径,LD_LIBRARY_PATH ,PKG_CONFIG_PATH , PATH 设置完毕。

 

   source/etc/bash.bashrc 使路径生效。

 

5 交叉编译自己的程序。

 

 arm-none-linux-gnueabi-gcc`pkg-config --cflags --libs directfb`fb.c -o fb

 

 交叉编译成功 。

 

总结:期间遇到的一些问题

1要交叉编译自己的程序,需要先交叉编译所依赖的库

 

2 如何交叉编译库

 在网上查找学习后,通过如下命令并不成功

 ./configure--host=arm-linux --prefix=$PREFIX --with-gfxdrivers=none--with-inputdrivers=all --disable-png --disable-jpeg --disable-zlib--enable-sdl=no --enable-gif=no --disable-x11

 原因:在执行configure时 指定了--host=arm-linux但是没有指定交叉编译器,系统没有找到交叉编译器,貌似就用了gcc编译,最后并未生成arm-linux的库,在编译后续的库时链接会找不到合适的库。需要先

 

 exportCC=arm-none-linux-gnueabi-gcc

 

 指定交叉编译器。

 

3 交叉编译好库之后设置好路径后就可以交叉编译程序了。

 

 

 

 

下面引用一篇关于交叉编译链接库配置的文章

 

 

 

交叉编译的时候不能使用本地(i686机器,即PC机器,研发机器)机器上的库,但是在做编译链接的时候默认的是使用本地库,即/usr/lib,/lib两个目录。因此,在交叉编译的时候,要采取一些方法使得在编译链接的时候找到需要的库。
首先,要知道:编译的时候只需要头文档,真正实际的库文档在链接的时候用到。 (这是我的理解,假如有不对的地方,敬请网上各位大侠指教)然后,讲讲如何在交叉编译链接的时候找到需要的库。
(1)、交叉编译时候直接使用-L和-I参数指定搜索非标准的库文档和头文档的路径。例如:
arm-linux-gcc test.c -L/usr/local/arm/2.95.3/arm-linux/lib-I/usr/local/arm/2.95.3/arm-linux/include
(2)、使用ld.so.conf文档,将用到的库所在文档目录添加到此文档中,然后使用ldconfig命令刷新缓存。
(3)、使用如下命令:
$ exportLD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/arm/2.95.3/arm-linux-lib
参见《ld.so.conf 文档和PKG_CONFIG_PATH变量》这篇文章。
通过环境变量LD_LIBRARY_PATH指定动态库搜索路径(!)。
通过设定环境变量LD_LIBRARY_PATH也可以指定动态库搜索路径。当通过该环境变量指定多个动态库搜索路径时,路径之间用冒号":"分隔。
不过LD_LIBRARY_PATH的设定作用是全局的,过多的使用可能会影响到其他应用程序的运行,所以多用在调试。(LD_LIBRARY_PATH的缺陷和使用准则,可以参考《Why LD_LIBRARY_PATH is bad》)。通常情况下推荐还是使用gcc的-R或-rpath选项来在编译时就指定库的查找路径,并且该库的路径信息保存在可执行文件中,运行时它会直接到该路径查找库,避免了使用LD_LIBRARY_PATH环境变量查找。
(4)、交叉编译时使用软件的configure参数。例如我编译minigui-1.3.3,使用如下配置:
#!/bin/bash
rm -f config.cache config.status
./configure --build=i686-linux --host=arm-linux --target=arm-linux/
CFLAGS=-I/usr/local/arm/2.95.3/arm-linux/include /
LDFLAGS=-L/usr/local/arm/2.95.3/arm-linux/lib /
--prefix=/usr/local/arm/2.95.3/arm-linux /
--enable-lite /
--disable-galqvfb /
--disable-qvfbial /
--disable-vbfsupport /
--disable-ttfsupport /
--disable-type1support /
--disable-imegb2312py /
--enable-extfullgif /
--enable-extskin /
--disable-videoqvfb /
--disable-videoecoslcd
这里我配置了CFLAGS和LDFLAGS参数,这样一来,我就不用去修改每个Makefile里-L和-I参数了,也不用再去配置LD_LIBRARY_PATH或改写ld.so.conf文档了。

Linux下动态库使用小结
1. 静态库和动态库的基本概念
静态库,是在可执行程序连接时就已经加入到执行码中,在物理上成为执行程序的一部分;使用静态库编译的程序运行时无需该库文件支持,哪里都可以用,但是生成的可执行文件较大。动态库,是在可执行程序启动时加载到执行程序中,可以被多个可执行程序共享使用。使用动态库编译生成的程序相对较小,但运行时需要库文件支持,如果机器里没有这些库文件就不能运行。
2. 如何使用动态库
如何程序在连接时使用了共享库,就必须在运行的时候能够找到共享库的位置。linux的可执行程序在执行的时候默认是先搜索/lib和/usr/lib这两个目录

 

 

 

 

Makefile预定义变量
  含义
  $*
  不包含扩展名的目标文件名称。
  $+
  所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件。
  $<<br>  第一个依赖文件的名称。
  $?
  所有的依赖文件,以空格分开,这些依赖文件的修改日期比目标的创建日期晚。
  $@
  目标的完整名称。
  $^
  所有的依赖文件,以空格分开,不包含重复的依赖文件。
  $%
  如果目标是归档成员,则该变量表示目标的归档成员名称。例如,如果目标名称为
  mytarget.so(image.o),则 $@ 为 mytarget.so,而 $% 为 image.o。
  AR
  归档维护程序的名称,默认值为 ar。
  ARFLAGS
  归档维护程序的选项。
  AS
  汇编程序的名称,默认值为 as。
  ASFLAGS
  汇编程序的选项。
  CC
  C 编译器的名称,默认值为 cc。
  CFLAGS
  C 编译器的选项。
  CPP
  C 预编译器的名称,默认值为 $(CC) -E。
  CPPFLAGS
  C 预编译的选项。
  CXX
  C++ 编译器的名称,默认值为 g++。
  CXXFLAGS
  C++ 编译器的选项。
  FC
  FORTRAN 编译器的名称,默认值为 f77。
  FFLAGS
  FORTRAN 编译器的选项。

你可能感兴趣的:(嵌入式 交叉编译DirectFB以及交叉编译configure详解)