基于openSUSE11.0交叉编译嵌入式linux系统产品

 

一、交叉编译简述

         交叉编译呢,简单地说,就是在一个平台上生成另一个平台上的可执行代码。这里需要注意的是所谓平台,实际上包含两个概念:体系结构(Architecture)、操作系统(Operating System)。同一个体系结构可以运行不同的操作系统;同样,同一个操作系统也可以在不同的体系结构上运行。举例来说,我们常说的x86 Linux平台实际上是Intel x86体系结构和Linux for x86操作系统的统称;而x86 WinNT平台实际上是Intel x86体系结构和Windows NT for x86操作系统的简称。

二、交叉编译的基础知识

        在做实际工作之前,我想我们应该先掌握一些关于交叉编译的基本知识,其实说白了也就是理解一些我们经常会碰到的英文单词:

  宿主机(host):编辑和编译程序的平台,一般是基于X86的PC机,通常也被称为主机。

  目标机(target):用户开发的系统,通常都是非X86平台。host编译得到的可执行代码在target上运行。

  perfix 交叉编译器的安装位置。

  xxx-xxxx-xxxxx 平台描述。

        我们在主机平台上开发程序,并在这个平台上运行交叉编译器,编译我们的程序;而由交叉编译器生成的程序将在目的平台上运行。这里值得说明得是平台描述,象arm-linux、i386-pc-linux2.4.3这样的字符串我们经常会看到,其实它是用来描述平台的,它有完整格式、缩减格式和别名之分。完整格式是:CPU-制造厂商-操作系统,如sparc-sun-sunos4.1.4,说明平台所使用的CPU是sparc,制造厂商是sun,上面运行的操作系统是SunOS,版本是4.1.4。当然,我们都不愿记这么长的东西,因此可以使用短格式,短格式中有选择地去除了制造厂商、软件版本等信息,因此我们同样可以用sparc-sunos或sparc-sunos-sunos4来描述这个平台。如果觉得这个还是太麻烦,那就可以使用别名,sun4m就可以很简单地描述这个平台。需要注意的是,并不是所有的平台都有别名,也不是所有的短格式都可以正确地描述平台。

三、交叉编译工具链功能说明

        在开发linux嵌入式平台时,开发厂商会推出一整套交叉工具链来配合自身的嵌入式产品。

交叉编译技术,就是一种在一个异构平台上编译出目标平台的技术。比如在PC平台(x86 CPU)上编译出运行在以嵌入式linux为内核的CPU平台上的程序,编译得到的程序在X86 CPU平台上是不能运行的,必须放到Linux CPU平台上才能运行。

        每一个软件在编译的过程中都要经过一系列的处理,才能从源代码变成可执行的目标代码。这一系列处理包括预编译、高级语言编译、汇编、链接及重定位。这一套流程里面用到的每个工具和相关的库组成的集合,就称为工具链(tool chain)。

 

四、开发步骤配置

        在我们嵌入系统开发过程中,首相安装openSUSE11.0操作系统作为宿主机,可以在openSUSE操作系统下编译和调试好您的代码,然后通过交叉编译以便减少系统出错的可能性;

        本文以MOXA公司的DA-66X-LX智能采集设备为例,在openSUSE操作系统下安装该公司的linux_tool-chain_1.0工具链,如果没有光盘您可以到MOXA官方网站上下载linux_tool-chain_1.0。

    # mount –t iso9660 /dev/cdrom /mnt/cdrom

# cp /mnt/cdrom/tool-chain/linux/install.sh /home/

# sh /home/install.sh

        工具链会自动安装到您的操作系统下,这时您只要加入工具链环境变量的路径中区,系统启动时会自动加载工具链的路径。

        使用gedit文本工具打开/etc/profile文件,在文件末尾行添加如下内容:

    MOXA_XSCALE = /user/local/xscale_be/bin

    PATH = $MOXA_XSCALE:$PATH

    export MOXA_XSCALE PATH

   

makefile_moxa

###########################################################################

# Title       : makefile_moxa(opensuse 11.0)

# Author   : liuxuezong

# Project  : PRJNAME

# date     : 2011.09.05 15:03

# ver      : 1.0

###########################################################################

 

OBJDIR     = $(PRJOUT)/$(PRJNAME)

DLLDIR     = $(FEPHOME)/bin

BINDIR     = $(FEPHOME)/bin

LIBDIR     = $(FEPHOME)/lib

CODEDIR        = $(FEPHOME)/code

INCPATH       = -I../inc -I$(FEPHOME)/code/include

PREFIXPATH = xscale_be-

 

####### Compiler, tools and options

AR       = $(PREFIXPATH)ar

CXX    = $(PREFIXPATH)g++

CC     = $(PREFIXPATH)gcc

LD     = $(PREFIXPATH)g++

MAKE   = make

GM     = gmake

YACC   = yacc

LEX    = lex

TAR            = tar -cf

COMPRESS       = gzip -9f

COPY           = cp -f

SED            = sed

COPY_FILE     = $(COPY)

COPY_DIR       = $(COPY) -R

STRIP          = $(PREFIXPATH)strip

INSTALL_FILE  = $(COPY_FILE)

INSTALL_DIR   = $(COPY_DIR)

INSTALL_PROGRAM   = $(COPY_FILE)

DEL_FILE      = rm -f

SYMLINK       = ln -f -s

DEL_DIR       = rmdir

MOVE          = mv -f

CHK_DIR_EXISTS    = test -d

MKDIR         = mkdir -p

 

####### Compiler, flags definitions

ARFLAGS    = -vr

CFLAGS     = -g $(DEFINES)

CXXFLAGS   = -fpic -w -g $(DEFINES)

LDCFLAGS   = -G -z defs -lsocket -lnsl -ldl

LDCXXFLAGS    = -shared

CLDFLAGS   = -g

CXXLDFLAGS    = -g -G

BINLIB     = -lc

THREAD_LIB    = -lpthread

SOCKET_LIB    = -lsocket -lnsl

DYLOAD_LIB    = -ldl

 

    在编译的Makefile包含路径指向使用makefile_moxa,本文Makefile以libdemo为例,其他程序也类似。

 

Makefile

PRJNAME    = libdemo

PRJOUT = /FEPDebug

 

include $(FEPHOME)/code/include/makefile_moxa

 

####### Files

SRCDIR =../src

 

SOURCES = stdafx.cpp \

      demo.cpp

 

OBJECTS = $(OBJDIR)/stdafx.o \

      $(OBJDIR)/demo.o

 

TARGET = $(DLLDIR)/$(PRJNAME).so

TARGETA = $(LIBDIR)/$(PRJNAME).a

 

####### Build rules

 

all: obj_dir $(TARGET) $(TARGETA)

 

obj_dir:

    @$(CHK_DIR_EXISTS) $(OBJDIR) || $(MKDIR) $(OBJDIR)

 

$(TARGET): $(OBJECTS)

    $(LD) $(LDCXXFLAGS) -o $@ $(OBJECTS)

   

$(TARGETA): $(OBJECTS) 

    $(AR) $(ARFLAGS) $@ $(OBJECTS)

 

####### Include file dependencies

 

depend:

    @(mkdepend   -p$(OBJDIR)/ -o.o $(INCPATH) $(SOURCES))>/dev/null 2>&1

    @rm -f makefile.bak

 

clean:

    rm -f $(OBJECTS)

    rm -f $(TARGET)

    rm -f $(TARGETA)

 

####### Compile

$(OBJDIR)/stdafx.o: $(SRCDIR)/stdafx.cpp

    $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $?

 

$(OBJDIR)/demo.o: $(SRCDIR)/demo.cpp

    $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $?

 

# DO NOT DELETE THIS LINE -- make depend depends on it.

 

四、生成交叉编译目标文件

        #make  (cd /openSUSE3000/fep/code/test_sys/unix)

xscale_be-g++ -c -fpic -w -g  -I../inc -I/openSUSE3000/fep/code/include -o /FEPDebug/libdemo/stdafx.o ../src/stdafx.cpp

xscale_be-g++ -c -fpic -w -g  -I../inc -I/openSUSE3000/fep/code/include -o /FEPDebug/libdemo/demo.o ../src/demo.cpp

xscale_be-g++ -shared  -o /openSUSE3000/fep/bin/libdemo.so /FEPDebug/libdemo/stdafx.o /FEPDebug/libdemo/demo.o

xscale_be-ar  -vr /openSUSE3000/fep/lib/libdemo.a /FEPDebug/libdemo/stdafx.o /FEPDebug/libdemo/demo.o

xscale_be-ar: 正在创建 /openSUSE3000/fep/lib/libdemo.a

a - /FEPDebug/libdemo/stdafx.o

a - /FEPDebug/libdemo/demo.o

        结束,经过上述编译之后,如果MOXA设备环境也相应的配置完成,您编译的目标文件通过ftp发布到MOXADA DA-66X-LX设备的对应目录中,就可以运行了。总之,如果您购买了第三方嵌入式系统的设备,对于一个嵌入系统刚入行的新手,您只要参考本文的模板进行嵌入系统的开发,基本上就能够满足您系统开发的要求。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值