您的位置:首页 > 其它

中兴机顶盒子,烽火机顶盒子的交叉编译环境搭建

2011-04-28 14:54 183 查看
要交叉编译,关键是要拿到交叉编译的工具,每个厂家的交叉编译工具都不一样,但是大同小异。

中兴的我拿到的是 STLinux-2.3.tar.tar 这样的压缩包

我解压到我的 /home 目录, 解压出来后的文件夹为 STLinux-2.3_uclibc

下来我们需要知道的是 目标板子上的芯片类型是什么类型, 中兴的为 sh4-linux-uclibc,

那我们就要找到 这个目标板子对应的 gcc 和 g++

中兴的就为 sh4-linux-uclibc-gcc 和 sh4-linux-uclibc-g++

所在的目录路径如下所示 :

[root@localhost bin]# pwd

/home/STLinux-2.3_uclibc/devkit/sh4_uclibc/bin

那我们下来就把这个目录路径添加到 环境变量里面, 让make的时候可以找到 这个路径,如下所示

PATH=$PATH:/home/STLinux-2.3_uclibc/devkit/sh4_uclibc/bin

在执行 env 这个命令, 就可以看到上面的目录路径添加到环境变量PATH里面了。

对于一个有 configure 文件的软件来说, 生成Makefile很简单,只需要指定 --host CC="" CXX="" 即可。

具体为:

./configure --host=sh4-linux-uclibc CC="sh4-linux-uclibc-gcc" CXX="sh4-linux-uclibc-g++"

下来 make 就可以了。

对于自己写的 Makefile文件,思路是一样的, 下面贴出我自己的Makefile文件对应的交叉编译配置 :

CROSSPATH=/home/STLinux-2.3_uclibc/devkit/sh4_uclibc
SHPREFIX=sh4-linux-uclibc-
LIBPATH=./ztelib
CC = ${SHPREFIX}gcc
CXX = ${SHPREFIX}g++
CFLAGS = -Wall -lulockmgr -pipe -D_FILE_OFFSET_BITS=64 -D_DEBUG -DDEBUG -O2
LDFLAGS = -ldl ./ztelib/libfuse.a ${LIBPATH}/libsqlite3.a /home/STLinux-2.3_uclibc/devkit/sh4_uclibc/uclibc_target/usr/lib/libpthrea
d.a /home/STLinux-2.3_uclibc/devkit/sh4_uclibc/uclibc_target/usr/lib/libc.a
MODULE_INC =  -I/home/fuse-2.8.3/include -I/home/sqlite-autoconf-3070500   -I./http -I${CROSSPATH}/uclibc_target/usr/include/c++/4.2
.4/ -I${CROSSPATH}/uclibc_target/usr/include/c++/4.2.4/sh4-linux-uclibc/
MODULE_LIB = -L${LIBPATH} -L./http -L${CROSSPATH}/uclibc_target/usr/lib -L${CROSSPATH}/uclibc_target
CFLAGS  += $(MODULE_INC)
LDFLAGS += $(MODULE_LIB)
LIBOBJS = debug.o  hash.o  fusex.o  listex.o  storex.o md5.o main.o  markup.o  http_fetcher.o
TARGET = clientstore_D
all: $(TARGET)
$(TARGET): $(LIBOBJS)
$(CXX) -o $@ $^ $(LDFLAGS)
rm -fr *.o
rm -fr *.xml
clean:
rm -f *.o
rm -f $(TARGET)
rm -f http/*.o
# make rule
%.o : %.c
$(CC) $(CFLAGS) -c $^ -o $@
%.o : %.cpp
$(CXX) $(CFLAGS) -c $^ -o $@


烽火的盒子也是一样的原理:

我拿到的烽火的交叉编译工具为 crosstools.tar

我也把它解压到 /home 目录

烽火的板子上的芯片为 mipsel-linux

我么也是找到对应的 gcc 和 g++

在 /home/crosstools/bin 这个目录下面有 mipsel-linux-gcc 和 mipsel-linux-g++

对于有 configure 文件的代码来说,执行下面的命令即可生成 Makefile文件 :

./configure --host=mipsel-linux CC="mipsel-linux-gcc" CXX="mipsel-linux-g++"

然后把 /home/crosstools/bin 这个目录添加到 环境编译 PATH中。

PATH="/home/crosstools/bin:$PATH" , 然后就可以直接make了。

自己写的Makefile文件例子如下:

CROSSPATH=/home/crosstools/bin
SHPREFIX=mipsel-linux-
LIBPATH=./fhlib
CC = ${SHPREFIX}gcc
CXX = ${SHPREFIX}g++
CFLAGS = -Wall -lulockmgr -pipe -D_FILE_OFFSET_BITS=64 -D_DEBUG -DDEBUG -O2
LDFLAGS = -ldl ./fhlib/libfuse.a ${LIBPATH}/libsqlite3.a /home/crosstools/mipsel-linux-uclibc/lib/libpthread.a /home/crosstools/mips
el-linux-uclibc/lib/libc.a
MODULE_INC =  -I/home/fuse-2.8.3/include -I/home/sqlite-autoconf-3070500  -I/home/crosstools/mips-linux-uclibc/include/c++/4.2.0 -I/
home/crosstools/mips-linux-uclibc/include/c++/4.2.0/mips-linux-uclibc
MODULE_LIB = -L${LIBPATH}  -L/home/crosstools/mipsel-linux-uclibc/lib
CFLAGS  += $(MODULE_INC)
LDFLAGS += $(MODULE_LIB)
LIBOBJS = debug.o  hash.o  fusex.o  listex.o  storex.o md5.o main.o  markup.o  http_fetcher.o
TARGET = clientstore_D
all: $(TARGET)
$(TARGET): $(LIBOBJS)
$(CXX) -o $@ $^ $(LDFLAGS)
rm -fr *.o
rm -fr *.xml
clean:
rm -f *.o
rm -f $(TARGET)
rm -f http/*.o
# make rule
%.o : %.c
$(CC) $(CFLAGS) -c $^ -o $@
%.o : %.cpp
$(CXX) $(CFLAGS) -c $^ -o $@


make 后就会生成你自己所要的可以在目标板子上运行的可执行程序。

我在这次交叉编译时,发现一个问题, 就是 执行 pthread_attr_init 时,

Segmentation fault 程序段错误。 原因就是libpthread.so 文件交叉编译的与目标板子上的版本不一致,后来我直接把 libpthread.a静态编译后就可以了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: