中兴机顶盒子,烽火机顶盒子的交叉编译环境搭建
要交叉編譯,關鍵是要拿到交叉編譯的工具,每個廠家的交叉編譯工具都不一樣,但是大同小異。
?
中興的我拿到的是? 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 *.orm -fr *.xml clean: rm -f *.orm -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 *.orm -fr *.xml clean: rm -f *.orm -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靜態編譯后就可以了。
?
?
?
?
?
總結
以上是生活随笔為你收集整理的中兴机顶盒子,烽火机顶盒子的交叉编译环境搭建的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 烽火HG680-L_S905L2芯片_线
- 下一篇: 命令卸载ie11