linux一些库文件的交叉编译

2019-07-12 23:30发布

 参考出处:一步步教你交叉编译嵌入式linux GUI-directfb+gtk   一、注意点: 1、在./configure的--host的选项可以为arm-linux或arm-none-linux-gnueabi(编译工具cross-4.3.2,也是本次用的编译工具,在安装目录下的/bin文件夹里可以用ls -l看到编译工具除了arm-linux-gcc和arm-none-linux-gnueabi-gcc,arm-linux-g++和arm-none-linux-gnueabi-g++不同外,其余的都相同,都是连接),他们两个是不同的,前者貌似采用eabi,后者采用oabi(新手一个,猜测的).这关系到使用这些库的程序在板上的无法运行(出现得最多的是在板运行程序时会出现:illegal instruction),如果内核打开对EABI的支持,那么最好使用EABI进行编译(我的板上linux内核版本是2.6.29,已经打开了对EABI的支持,且qtopia2.20的文件系统也支持EABI),所以采用arm-linux进行编译。 具体可以参考: arm Linux 2.6高版本中的系统调用方式 GNU arm 汇编求助
2、如果采用一种编译器进行编译,那么被依赖的那个库也一样要用同种编译器进行编译。   二、设置环境变量(本人用的是ubuntu9.04)   export SOURCE_PATH=/home/evix/src
export PREFIX=/opt/arm
export LDFLAGS=-L$PREFIX/lib
export CFLAGS="-g -I$PREFIX/include"
export PKG_CONFIG_PATH=${PREFIX}/lib/pkgconfig   三、编译库文件(#在最前前面的表示注释)    1.交叉编译tslib, 依赖的库: 无
=========开始交叉编译tslib=========

安装编译过程需用到的程序
apt-get install autoconf(或autoconf2.13)
apt-get install automake
apt-get install libtool

cd ${BUILDDIR}
tar xzvf ${SOURCE_PATH}/tslib-1.4.tar.gz
cd tslib
source autogen.sh

./configure --host=arm-linux --prefix=$PREFIX ac_cv_func_malloc_0_nonnull=yes

make
make install     2.交叉编译glib, 依赖的库: 无

=========开始交叉编译glib=========

cd ${BUILDDIR}
tar xzvf ${SOURCE_PATH}/glib-2.22.2.tar.gz
cd glib-2.22.2
echo "glib_cv_stack_grows=no" > arm-linux.cache
echo "glib_cv_has__inline=yes" >> arm-linux.cache
echo "glib_cv_working_bcopy=no" >> arm-linux.cache
echo "glib_cv_uscore=no" >> arm-linux.cache
echo "ac_cv_func_posix_getpwuid_r=yes" >> arm-linux.cache
echo "ac_cv_func_posix_getgrgid_r=yes" >> arm-linux.cache

./configure --host=arm-linux --prefix=$PREFIX --cache-file=arm-linux.cache

make
make install   3.交叉编译jpeg, 依赖的库: 无

=========开始交叉编译jpeg=========
cd ${BUILDDIR}
tar -zxvf ${SOURCE_PATH}/jpegsrc.v6b.tar.gz
cd jpeg-6b

#注意这里的./configure是没有--host=arm-linux,所以以下要用sed命令替换makefile中x86的配置
./configure -prefix=$PREFIX --enable-shared --enable-static

sed -i -e 's/CC= gcc/CC= arm-linux-gcc/g' Makefile
sed -i -e 's/AR= ar rc/AR= arm-linux-ar rc/g' Makefile
sed -i -e 's/AR2= ranlib/AR2= arm-linux-ranlib/g' Makefile

如果单单编译jpeg这个库,必须在所指安装目录下建立好bin,include,lib这三个文件夹
#mkdir $PREFIX/include
#mkdir $PREFIX/bin
#mkdir $PREFIX/lib
mkdir -p $PREFIX/man/man1

make
make install    4.交叉编译zlib, 依赖的库: 无

=========开始交叉编译zlib=========


cd ${BUILDDIR}
tar xzvf ${SOURCE_PATH}/zlib-1.2.3.tar.gz
cd zlib-1.2.3

CC=arm-linux-gcc AR="arm-linux-ar rc" RANLIB=arm-linux-ranlib ./configure --prefix=$PREFIX --shared

make
make install   5.交叉编译libpng, 依赖的库: zlib

=========开始交叉编译libpng=========

cd ${BUILDDIR}
tar xzvf ${SOURCE_PATH}/libpng-1.2.40.tar.tar
cd libpng-1.2.40

LDFLAGS="-L$PREFIX/lib" CFLAGS="-g -I$PREFIX/include" ./configure --host=arm-linux --prefix=$PREFIX

make
make install    6.交叉编译freetype, 依赖的库: 无

=========开始交叉编译freetype=========

cd ${BUILDDIR}
tar xjf ${SOURCE_PATH}/freetype-2.3.5.tar.gz
cd freetype-2.3.5

./configure --host=arm-linux --prefix=$PREFIX

make
make install     7.交叉编译libxml, 依赖的库: 无

=========开始交叉编译libxml=========

cd ${BUILDDIR}
tar xzf ${SOURCE_PATH}/libxml2-2.7.4.tar.gz
cd libxml2-2.7.4

./configure --host=arm-linux --prefix=$PREFIX

make
make install   8.交叉编译fontconfig, 依赖的库: freetype, libxml2

=========开始交叉编译fontconfig=========

cd ${BUILDDIR}

tar xzf ${SOURCE_PATH}/fontconfig-2.7.2.tar.gz
cd fontconfig-2.7.2

LIBXML2_LIBS="-L$PREFIX/lib -lxml2" LIBXML2_CFLAGS=-I$PREFIX/include/libxml2 ./configure --host=arm-linux --prefix=$PREFIX --with-freetype-config=$PREFIX/bin/freetype-config --with-arch=arm

make
make install    9.交叉编译lcms, 依赖的库:   =========开始交叉编译lcms=========

tar zxvf lcms-1.18a.tar.gz
cd lcms-1.18

#在./congfigure前要把congfigure文件中的PACKAGE_STRING='lcms 1.18'(利用查找)修改为中间不能有空格的,如PACKAGE_STRING='lcms_1.18',否则用-host=arm-linux,在make的时候会报错(arm-none-linux-gnueabi-gcc: 1.18": No such file or directory)

./configure -host=arm-linux -prefix=$PREFIX

make
make install   # 10.交叉编译poppler, 依赖的库: freetype, fontconfig, libxml2, libcms, QtE库(QtE库的编译网上应该很多)

echo "=========开始交叉编译poppler========="

tar zxvf poppler-0.11.3.tar.gz
cd poppler-0.11.3

export QTEDIR=/usr/local/Trolltech/QtEmbedded-4.5.2-arm


指定freetype的include文件时,需指定PKG_CONFIG_PATH,详情可以看poppler的configure

CFLAGS="-g -I/opt/arm/include" PKG_CONFIG_PATH=/opt/arm/lib/pkgconfig LDFLAGS="-L/opt/arm/lib" FREETYPE_CFLAGS="-I$PREFIX/include/freetype2" FREETYPE_LIBS="-L$PREFIX/lib -lfreetype" FONTCONFIG_CFLAGS="-I$PREFIX/include" FONTCONFIG_LIBS="-L$PREFIX/lib -lfontconfig" POPPLER_QT4_CFLAGS="-DQT_SHARED -I$QTEDIR/include" POPPLER_QT4_LIBS="-L$QTEDIR/lib -lQtGui -lQtXml -lQtCore" POPPLER_QT4_TEST_CFLAGS="-DQT_SHARED -I$QTEDIR/include" POPPLER_QT4_TEST_LIBS="-L$QTEDIR/lib -lQtTest -lQtCore" ./configure --host=arm-linux --prefix=$PREFIX

make
make install   本人是新手一个,本来想是想编译一个poppler库出来,没想到它所依赖的库文件有如此多,所以在编译的时候花费了很长一段时间,其中包括到网上找资料,请教他人(这里感谢“魔力小子”这位热心的朋友),希望写这篇东西能帮一些刚上手的朋友少走点弯路。~_~,第一篇博客