交叉编译DirectFB

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

 

首先记录下编译的过程

 

 

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

 

2 交叉编译安装freetype

 

 export CC=arm-none-linux-gnueabi-gcc

 

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

 

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

 make

 make install

 

freetype安装完毕

 

3 交叉编译directfb

 

 export LDFLAGS=-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的库,在编译后续的库时链接会找不到合适的库。需要先

 

 export CC=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)、使用如下命令:
$ export LD_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预定义变量
  含义
  $*
  不包含扩展名的目标文件名称。
  $+
  所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件。
  $<
  第一个依赖文件的名称。
  $?
  所有的依赖文件,以空格分开,这些依赖文件的修改日期比目标的创建日期晚。
  $@
  目标的完整名称。
  $^
  所有的依赖文件,以空格分开,不包含重复的依赖文件。
  $%
  如果目标是归档成员,则该变量表示目标的归档成员名称。例如,如果目标名称为
  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 编译器的选项。

 



  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
交叉编译 Qt 5.14.2 源码,需要先安装交叉编译工具链和对应的库文件,然后使用 Qt 的 configure 工具进行配置,最后进行编译。 以下是一个简单的步骤: 1. 安装交叉编译工具链和库文件,例如 arm-linux-gnueabihf-gcc 和 libssl-dev。可以参考交叉编译工具链的文档或者咨询厂商的技术支持。 2. 下载 Qt 5.14.2 源码包,解压后进入源码目录。 3. 配置 Qt 的编译选项,使用 configure 工具。可以使用以下命令: ``` ./configure -prefix /opt/qt5 \ -release -opensource -confirm-license \ -no-icu -no-opengl -no-xcb -no-glib -no-pulseaudio \ -no-feature-bearermanagement -no-feature-ftp \ -no-feature-socks5 -no-feature-xmlstream -no-feature-xml \ -no-feature-qml-debug -no-feature-process -no-feature-sharedmemory \ -no-feature-animation -no-feature-printer -no-feature-qml-network \ -no-feature-qml -no-feature-qml-debug -no-feature-qml-designer \ -no-feature-qml-filesystem -no-feature-qml-debugger -no-feature-qml-workerscript \ -no-feature-qml-xmlhttprequest -no-feature-qml-workercontext \ -no-feature-qml-websockets -no-feature-qml-webchannel \ -no-feature-qml-mirroring -no-feature-qml-live-reload \ -no-feature-qml-context2d \ -opensource -confirm-license \ -no-sql-sqlite -no-sql-sqlite2 -no-sql-odbc -no-sql-psql \ -no-sql-mysql -no-sql-ibase -no-sql-tds -no-sql-tds \ -no-ssl -no-openssl \ -no-feature-geoservices -no-feature-geoservices-mapboxgl \ -no-feature-geoservices-nokia -no-feature-geoservices-google \ -no-feature-geoservices-here -no-feature-geoservices-mapbox \ -no-feature-geoservices-osm \ -no-feature-testlib \ -no-qml-debug \ -no-widgets \ -no-gui \ -no-iconv \ -no-compile-examples \ -no-cups \ -no-dbus \ -no-fontconfig \ -no-freetype \ -no-harfbuzz \ -no-journald \ -no-kms \ -no-linuxfb \ -no-mirclient \ -no-mtdev \ -no-pcre \ -no-pulseaudio \ -no-rpath \ -no-sm \ -no-syslog \ -no-tslib \ -no-xcb-xinput \ -no-xkbcommon \ -no-xinerama \ -no-xinput \ -no-xkb \ -no-xcursor \ -no-xfixes \ -no-xrandr \ -no-xrender \ -no-xshape \ -no-xsync \ -no-xvideo \ -no-zlib \ -no-eglfs \ -no-gbm \ -no-directfb \ -no-linuxfb \ -no-mirclient \ -no-wayland \ -no-icu \ -no-opengl \ -no-glib \ -platform linux-g++-32 \ -xplatform linux-arm-gnueabi-g++ \ -device-option CROSS_COMPILE=/usr/bin/arm-linux-gnueabihf- \ -device-option SYSROOT=/path/to/sysroot ``` 其中,-prefix 指定 Qt 的安装路径,-xplatform 指定交叉编译的平台,-device-option 指定交叉编译工具链的前缀和 sysroot 路径。 4. 执行 make 命令进行编译。 5. 执行 make install 命令进行安装。 完成以上步骤后,就能在指定的安装路径下找到交叉编译后的 Qt 库和工具了。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值