如何进行交叉编译

标题:如何进行交叉编译
作者:kagula
日期:2008-3-21


环境:
     [1]arm-linux-gcc-3.4.1.tar.bz2包
     [2]Ubuntu7.10Desktop


阅读前提:
    [1]有交叉编译的概念 
   [2]有pc文件概念


概要:
 在宿主机上,编译目标机(ARM)上的软件包


正文:
   分四部份:
第一部份:配置环境变量PATH
              我是用gedit ~/.bashrc
     文件尾部,增加
              PATH=$PATH:/usr/local/arm/3.4.1/bin
第二部份:配置其它环境变量
      它的作用,是使待编译包,找得到头文件,和库文件
export COMPILE_ROOT=/usr/local/arm/3.4.1  #编译根
export CFLAGS="-I$COMPILE_ROOT/arm-linux/include -I$COMPILE_ROOT/include/c++/3.4.1 -I/home/lijun/scim-1.2.3/src"  #头文件search位置
export LDFLAGS="-L$COMPILE_ROOT/arm-linux/lib  -L$COMPILE_ROOT/lib -L$COMPILE_ROOT/lib/gcc/arm-linux/3.4.1 -L/home/lijun/scim-1.2.3/lib -L/home/lijun/root_nfs/usr/lib -L/home/lijun/root_nfs/lib"  #库文件search位置
export PKG_CONFIG_PATH=/home/lijun/scim-1.2.3  #指定pc文件路径;pc文件,包含了某个依赖项,头文件和库文件搜索路径。
第三部份:调用configure生成Makefile文件
      下面是configure的例子
CC=arm-linux-gcc ./configure --host=arm-linux --prefix=/home/kagula  --disable-skim-support CFLGS="$CFLAGS" LDFLAGS="$LDFLAGS"
       其中--preifx  指定目标位置(软件包的安装位置)
         -disable-skim-support是scim-pinyin包,configure的特殊选项
       你可以通过./configure --help查看,configure能够接受的参数
第四部份:Make,没有找到哪个文件,就修改CFLAGS和LDFLAGS参数,使得指向没有找到的文件(可能是H文件,也可能是某个so文件)
       直到make成功!
             这时,会在当前目录的/src/.libs下生成目标so文件(库文件),make install后,就会把编译好的文件,安装到目标位置。
             注意:在目标安装位置下会自动建立include、lib、 share文件夹。


备注:
[1]在宿主机上你可以使用下面的命令,查看,某个可执行文件,它的依赖项
arm-linux-readelf -a 可执行程序文件名|grep "Shared library"
(对本地可执行文件可以使用ldd命令,查看它的依赖项)
在开发板上你可以用下面的命令,查看可执行文件的依赖项
/lib/ld-linux.so.2 --list 可执行程序文件名(这相当于ldd 可执行程序文件名)


参考资料:
[1]交叉编译时候如何设置连接库的搜索路径
http://blog.chinaunix.net/u1/46715/showart_447639.html
[2]ld.so.conf 文件与PKG_CONFIG_PATH变量
http://hi.baidu.com/dexinmeng/blog/item/5512cf018b8941d5277fb571.html
[3]部份源码包下载位置
http://www.paldo.org/index.php?section=packages&page=main&releaseid=100040


附:ARM-2.95.3编译scim-pinyin-0.5.91包的例子
#COMPILE_ROOT编译器位置
#ROOTFS_DIR依赖包位置
#/home/kagula是目标安装位置,也包括部份依赖包
export COMPILE_ROOT=/usr/local/arm/2.95.3
export ROOTFS_DIR=/home/lijun/root_nfs
export CFLAGS="-I$COMPILE_ROOT/include -I$COMPILE_ROOT/arm-linux/include -I$ROOTFS_DIR/usr/X11R6/include -I/home/kagula/include"
export LDFLAGS="-L$COMPILE_ROOT/arm-linux/lib -L$COMPILE_ROOT/lib   -L$ROOTFS_DIR/usr/X11R6/lib/  -L/home/kagula/lib -L$ROOTFS_DIR/usr/lib"
export PKG_CONFIG_PATH=/home/kagula/lib/pkgconfig:$ROOTFS_DIR/usr/lib/pkgconfig
export HAVE_X=" --x-includes=$ROOTFS_DIR/usr/X11R6/include --x-libraries=$ROOTFS_DIR/usr/X11R6/lib --with-x  "
export GTK2_CFLAGS="-I/home/kagula/include -I$ROOTFS_DIR/usr/include/gtk-2.0 -I$ROOTFS_DIR/lib/gtk-2.0/include -I$ROOTFS_DIR/usr/include/atk-1.0 -I$ROOTFS_DIR/usr/include/cairo -I$ROOTFS_DIR/usr/include/pango-1.0 -I$ROOTFS_DIR/usr/include/glib-2.0 -I$ROOTFS_DIR/usr/lib/glib-2.0/include -I$ROOTFS_DIR/usr/include/freetype2 -I$ROOTFS_DIR/usr/include/libpng12 -I$ROOTFS_DIR/usr/lib/gtk-2.0/include  -I$ROOTFS_DIR/usr/X11R6/include"
export GTK2_LIBS="-L/home/kagula/lib   -L/home/kagula/root_nfs/lib  -L$ROOTFS_DIR/usr/lib  -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lpangocairo-1.0 -lfontconfig -lXext -lXrender -lXinerama -lXi -lXrandr -lXcursor -lXcomposite -lXdamage -lcairo -lX11 -lXfixes -lpango-1.0 -lgdk_pixbuf-2.0 -lm -lgobject-2.0 -lgmodule-2.0 -ldl -lglib-2.0"
export GTHREAD2_CFLAGS="-pthread -I$ROOTFS_DIR/usr/include/glib-2.0 -I$ROOTFS_DIR/usr/lib/glib-2.0/include"
export GTHREAD2_LIBS="-pthread -lgthread-2.0 -lrt -lglib-2.0"
echo ac_cv_file__usr_share_sgml_docbook_xsl_stylesheets_html_tldp_html_xsl=yes >arm-linux.cache
echo "ac_cv_func_malloc_0_nonnull=yes" >>arm-linux.cache
CC=arm-linux-gcc ./configure --host=arm-linux --prefix=/home/kagula   --disable-skim-support  CFLGS="$CFLAGS" LDFLAGS="$LDFLAGS"  $HAVE_X --with-x --cache-file=arm-linux.cache  --with-gnu-ld --with-gtk-im-module-dir=$ROOTFS_DIR/usr/lib/gtk-2.0/immodules

在下面位置修改源代码,比如text.clear();  改为text.erase(0,text.size());
scim_pinyin_imengine.cpp:2359 2471 2479 2589 2590
scim_pinyin_smart_match.cpp:727

scim_special_table.cpp: In method `class scim::WideString SpecialTable::get_date(int) const':
scim_special_table.cpp:336: implicit declaration of function `int snprintf(...)'
make[2]: *** [libpinyin_la-scim_special_table.lo] 错误 1
开头的地方加上一句:#define Uses_C_STDIO
make 
make install

 

你可能感兴趣的:(C++)