轻松的学习,简单的记录

导航

公告

统计

2010年3月9日 #

MTK分布式编译提高编译速度(IncredBuild) 收藏

一台机子编译一个程序要几个小时,如果利用上开发小组的其它联网电脑实现资源共享提高速度是不错的解决方式

下面说一下怎样利用increbuild实现分布式编译

1.make文件夹里面的Gsm2.mak修改make工具的编译项为IncredBuild增加运行参数
#@echo tools\make.exe -fmake\comp.mak -r -R COMPONENT=$* ... $(strip $(COMPLOGDIR))\$*.log
 @if /I %OS% EQU WINDOWS_NT \
  (if /I $(BM_NEW) EQU TRUE \
   (XGConsole /command="tools\make.exe -fmake\comp.mak -k -r -R $(strip $(CMD_ARGU)) COMPONENT=$* > $(strip $(COMPLOGDIR))\$*.log 2>&1" /NOLOGO /profile="tools\XGConsole.xml")  \
  else \
   (XGConsole /command="tools\make.exe -fmake\comp.mak -r -R $(strip $(CMD_ARGU)) COMPONENT=$* > $(strip $(COMPLOGDIR))\$*.log 2>&1" /NOLOGO /profile="tools\XGConsole.xml")  \
  ) \
 else \
  (if /I $(BM_NEW) EQU TRUE \
   (tools\make.exe -fmake\comp.mak -k -r -R $(strip $(CMD_ARGU)) COMPONENT=$* > $(strip $(COMPLOGDIR))\$*.log) \
  else \
   (tools\make.exe -fmake\comp.mak -r -R $(strip $(CMD_ARGU)) COMPONENT=$* > $(strip $(COMPLOGDIR))\$*.log) \
  )
 @type $(strip $(COMPLOGDIR))\$*.log >> $(LOG)
 @perl .\tools\chk_lib_err_warn.pl $(strip $(COMPLOGDIR))\$*.log

 

2.tools工具夹里面加入 XGConsole.xml
内容为
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<Profile FormatVersion="1">
<Tools>
<Tool Filename="perl" AllowRemote="true" />
<Tool Filename="make" AllowIntercept="true" />
<Tool Filename="tcc" AllowRemote="true" />
<Tool Filename="tcpp" AllowRemote="true" />
<Tool Filename="armcc" AllowRemote="true" />
<Tool Filename="armcpp" AllowRemote="true" />
<Tool Filename="strcmpex" AllowRemote="true" />
<Tool Filename="warp" AllowRemote="true" />
<Tool Filename="armar" AllowRemote="false" />
<Tool Filename="formelf" AllowRemote="false" />
</Tools>
</Profile>

 

3.tools工具夹里面的make2.pl修改以下几行
if (($action eq "update") || ($action eq "remake") || ($action eq "new") || ($action eq "bm_new") ||
    ($action eq "c,r") || ($action eq "c,u")) {
  if ($ENV{"NUMBER_OF_PROCESSORS"} > 1) {
    if ($fullOpts eq "") {
      $fullOpts = "CMD_ARGU=-j$ENV{\"NUMBER_OF_PROCESSORS\"}";
    } else {
      $fullOpts .= ",-j$ENV{\"NUMBER_OF_PROCESSORS\"}";
    }
  }
}
改为
if (($action eq "update") || ($action eq "remake") || ($action eq "new") || ($action eq "bm_new") ||
    ($action eq "c,r") || ($action eq "c,u")) {
  if ($ENV{"NUMBER_OF_PROCESSORS"} >= 1) {
    if ($fullOpts eq "") {
      $fullOpts = "CMD_ARGU=-j$ENV{\"NUMBER_OF_PROCESSORS\"}"."0";
    } else {
      $fullOpts .= ",-j$ENV{\"NUMBER_OF_PROCESSORS\"}"."0";
    }
  }
}


$ENV{"NUMBER_OF_PROCESSORS"} = 10;  //修改为你想要的进程数

 

4.把tools里面的make.exe换成多任务的文件


本文来自CSDN博客,转载请标明出处:http://www.cnblogs.com/big_sky/admin/file:///F:/资料/mtk相关网络查询知识/MTK分布式编译提高编译速度(IncredBuild)%20-%20wangfucai的专栏%20-%20CSDN博客.htm

posted @ 2010-03-09 09:50 菜鸟的宣言 阅读(1107) 评论(0) 编辑

MTK编译过程之三

MTK 软件工程的配置说明 请下载我的资源《MTK软件工程和配置简介.doc》

本文详解MTK的编译过程,并会根据我的理解来更新。阅读上文对本文的一些文件和术语会有很好的帮助。

导读:
  Comp.mak 完成模块编译连接,生成bin
  Gsm2.mak 主编译文件,完成clean,remake,new等工作
  XXX_GPRS.mak 客户私有的配置,根据客户的不同,而设定不同的配置文件
  Option.mak 工程中的基本配置及宏定义文件
  Verno_XXX.bld 版本文件
  Custom.bld 要保证在客户版本中都使用相同的配置的地方要写在这里,这个里面的一些文件不能被改变
  第一步:
  1.Make.bat命令首先调用ChgFileMode.bat,将编译过程中需要用到的文件的只读属性修改为可读写,再调用make2.pl。
  2.Make2.pl的主要工作就是匹配gsm2.mak的参数,然后通过命令
  system("${makeCmd} -f${makeFolder}${myMF} -r -R CUSTOMER=$custom PROJECT=$project $action");来调用gsm2.mak。
  具体解析出来就是
  make -f make\gsm2.mak -r –R CUSTOMER=工程名 PROJECT=gprs new|update|remake
  第二步:整个过程如图
  Gsm2.mak
  Option.mak
  XXX_GPRS.mak
  REL_CR_MMI_GPRS.mak
  USER_SPECIFIC.mak
  
  1.在Gsm2.mak文件的开始处调用了option.mak文件。
  2.Option.mak又将make\$(strip $(CUSTOMER))_$(strip$(PROJECT)).mak文件包含进来,这个模式匹配结果为:make目录下,工程名称_GPRS.mak,如K500GSD_GPRS.mak。
  3.在$(strip $(CUSTOMER))_$(strip$(PROJECT)).mak文件中又调用了REL_CR_MMI_$(strip$(PROJECT)).mak文件,这个文件模式具体被解析为make目录下的REL_CR_MMI_GPRS.mak文件。
  REL_CR_MMI_GPRS.mak这个文件定义了哪些文件需要加入到编译目录中。
  其中定义了MMI部分的编译目录为MMIDIR = plutommi。
  在变量CUS_REL_BASE_COMP中定义了资源的编译目录:
  CUS_REL_BASE_COMP += $(strip $(MMIDIR))\mmi $(strip $(MMIDIR))\mtkapp $(strip$(MMIDIR))\tool $(MMIDIR)\WIN32FS
  CUS_REL_BASE_COMP += $(strip$(MMIDIR))\Customer\CustomerInc \
  $(strip $(MMIDIR))\Customer\Customize \
  $(strip $(MMIDIR))\Customer\CustResource\$(strip $(MMI_VERSION))\
  $(strip $(MMIDIR))\Customer\debug \
  $(strip $(MMIDIR))\Customer\Images\GameImages \
  $(strip $(MMIDIR))\Customer\Images\decoder \
  $(strip $(MMIDIR))\Customer\Res_MMI \
  $(strip $(MMIDIR))\Customer\ResGenerator \
  $(strip $(MMIDIR))\Customer\ResourceDLL \
  $(strip $(MMIDIR))\Customer\Resources \
  $(strip $(MMIDIR))\Customer\Audio
  客户的资源需要编译如下文件:CUS_REL_SRC_COMP += mmiresource mtkapp gdi_arm plutommi vendorapp
  图片名称为:CUS_REL_BASE_COMP += $(strip$(MMIDIR))\Customer\Images\$(strip $(MMI_PROJ))$(strip$(MAIN_LCD_SIZE)),可解析为如:
  plutommi\customer\images\K500GSD176X220
  
  REL_CR_MMI_$(strip $(PROJECT)).mak
  其中CUS_REL_OBJ_LIST这个变量存储了连接过程中所需要的文件名称
  
  4.make\$(strip $(CUSTOMER))_$(strip$(PROJECT)).mak文件的功能。
  CUSTOM_OPTION定义了所有需要编译进去的功能模块的宏。
  COMPLIST变量的功能:
  ifeq ($(strip $(RTOS)),NUCLEUS)
  COMPLIST = nucleus nucleus_int nucleus_ctrl_code nucleus_critical_data
  Endif
  如果操作系统为NUCLEUS,那么COMPLIST为后面的值,COMPLIST为所要编译的文件列表,里面存放了很多*.inc文件,展开后就变为
  config\include
  stacklib\include
  adaptation\include
  kal\include等等
  
  5. option.mak文件的在后面调用了make\USER_SPECIFIC.mak
  如果使用CPU为ARM,则编译工具目录为如下定义
  ifeq ($(strip $(COMPILER)),ADS)
  DIR_ARM = c:\progra~1\arm\adsv1_2
  DIR_ARM := $(strip $(DIR_ARM))
  DIR_TOOL = $(DIR_ARM)\bin
  DIR_ARMLIB = $(DIR_ARM)\lib
  DIR_ARMINC = $(DIR_ARM)\include
  Endif
  连接打包工具等为如下几个:
  DIR_TOOL := $(strip $(DIR_TOOL))
  LINK = $(DIR_TOOL)\armlink.exe # Linker
  ASM = $(DIR_TOOL)\armasm.exe # ARM assembler
  LIB = $(DIR_TOOL)\armar.exe # Library tool
  BIN_CREATE = $(DIR_TOOL)\fromelf.exe # Binary tool
  下面这段代码告诉我们需要用什么编译工具来编译
  ifeq ($(strip $(COMPILER)),ADS)
  ifeq ($(strip $(COMPILE_MODE)),INST16)
  CC = $(DIR_TOOL)\tcc.exe # Thumb Mode(16bits), use tcc
  CC32 = $(DIR_TOOL)\armcc.exe # ARM Mode(32bits), use armcc
  CPPC = $(DIR_TOOL)\tcpp.exe # Thumb Mode(16bits), use tcc
  CPPC32 = $(DIR_TOOL)\armcpp.exe # ARM Mode(32bits), use armcc
  else
  ifeq ($(strip $(COMPILE_MODE)),INST32)
  CC = $(DIR_TOOL)\armcc.exe # ARM Mode(32bits), use armcc
  CPPC = $(DIR_TOOL)\armcpp.exe # ARM Mode(32bits), use armcc
  else
  CC = $(DIR_TOOL)\tcc.exe # Default tcc
  CC32 = $(DIR_TOOL)\armcc.exe # ARM Mode(32bits), use armcc
  CPPC = $(DIR_TOOL)\tcpp.exe # Thumb Mode(16bits), use tcc
  CPPC32 = $(DIR_TOOL)\armcpp.exe # ARM Mode(32bits), use armcc
  endif
  endif
  endif
  
  ifeq ($(strip $(PLATFORM)),MT6223P)
  AFLAGS := -g -littleend -cpu ARM7EJ-S
  Endif
  
  COMMINCDIRS变量在先包含了基本功能模块的inc目录后再包含如下文件
  COMMINCDIRS += $(DIR_ARMINC) $(CUSTOM_COMMINC),
  
  6.Option.mak中定义了一些附加功能模块的编译模式(是否被编译,被编译成什么样的结果),比如说蓝牙,UART3,WIFI,USB,WAP等等,还有一些编译器的设置。
  我们的版本号和Scat文件被定义在这个变量中:5056L
  SCATTERFILE = custom\system\$(strip$(BOARD_VER))\scat$(strip $(PLATFORM)).txt
  VERNOFILE = make\Verno_$(CUSTOMER).bld
  .bin文件的名称设置在这个变量TARGNAME = $(CUSTOMER)_$(strip$(SUB_BOARD_VER))_$(PROJECT)_$(strip $(PLATFORM))_$(strip$(CHIP_VER))
  TST_DB := $(strip $(TSTDIR))\database_classb
  然后被包含到Option.mak文件中来,include $(strip$(VERNOFILE))。
  
  7.Gsm2.mak文件中new执行的指令
  new : cleanall cmmgen mmi_feature_check asngen codegen asnregen operator_check_lite update
  
  update所执行的指令
  update : cleanlog cleanbin mcddll_update codegen resgen cksysdrv remake
  
  remake所执行的指令
  remake : mcp_check cleanlog cleanbin genverno libs $(BIN_FILE) done
  
  resgen用来编译资源文件:Res_XXX.c
  
  (echo CUSTOM_OPTION = $(foreach def,$(BOARD_VER) $(PLATFORM) $(LCD_MODULE) $(EXT_CAM_MODULE)$(CMOS_SENSOR),-D "$(def)") \>$(MMIDIR)\customer\resGenerator\custom_option.txt)
  首先将CUSTOM_OPTION重定向到custom_option.txt中
  
  (type make\~cus_opt.tmp >>$(MMIDIR)\customer\resGenerator\custom_option.txt)
  使用tools\strcmpex.exe生成~cus_opt.tmp, ~tgt_opt.tmp,~inc.tmp三个文件
  将~cus_opt.tmp 重定向到custom_option.txt中
  
  (@del $(MMIDIR)\mmi\TargetOption.txt) &\
  (copy /Y make\~tgt_opt.tmp $(MMIDIR)\MMI\TargetOption.txt)
  再将TargetOption.txt更新一下,将~tgt_opt.tmp重定向到TargetOption.txt中
  
  (type make\~inc.tmp >$(MMIDIR)\customer\resGenerator\custom_include.tmp)
  再将~inc.tmp重定向到custom_include.tmp中,
  
  执行replace_project_name.pl文件,编译Res_XXX.c
  再执行ResGenerator_HW.bat,编译资源文件。
  
  8.Remake中的编译过程是在libs中完成的
  目标依赖:libs: cleanlib startbuildlibs $(COMPLIBLIST)
  Cleanlib在这个依赖中做的动作是清掉上次生成的.bin,.elf,.lis等文件,接着清掉需要重新来生成的.lib文件。$(COMPLIBLIST)这个依赖就是我们需要重新生成的.lib文件。
  .lib文件的依赖关系:%.lib:
  在这个依赖关系中所做的动作是设置编译器,链接器以及这个过程的参数等其他信息,然后将这些信息输出到:~compbld.tmp临时文件中。
  
  (tools\make.exe -fmake\comp.mak -k -r -R $(strip $(CMD_ARGU)) COMPONENT=$* >$(strip $(COMPLOGDIR))\$*.log) \
  调用了make命令来执行comp.mak文件,并且可以看到> $(strip$(COMPLOGDIR))\$*.log
  该语句将执行comp.mak文件时产生的信息存放在当前编译部分的.log文件中,通常看编译信息的比如custom.log等就是该中类型的文件。
  
  依赖关系:update_lib: $(TARGLIB)
  $(TARGLIB) : $(COBJS) $(CPPOBJS) $(AOBJS) $(ARMOBJS)
  $(TARGLIB)依赖很多.c和.obj
  .c.obj:
  @echo Compiling $< ...
  @tools\strcmpex.exe $(ACTION) remake e $(*F).via $(CINTWORK) -c $(CFLAGS) $(CDEFS) $(CINCDIRS) -o $(COMPOBJS_DIR)/$@$<
  @tools\strcmpex.exe $(ACTION) remake n $(*F).via $(CINTWORK) -c $(CFLAGS) $(CDEFS) $(CINCDIRS) $(MD) -o$(COMPOBJS_DIR)/$@ $<
  @if exist $(*F).via tools\warp.exe $(*F).via
  @if exist $(*F).via $(CMPLR) $(VIA) $(*F).via
  @if not $(ACTION)==remake if exist $(FIXPATH)\$(*F).d perl.\tools\pack_dep.pl $(FIXPATH)\$(*F).d >$(RULESDIR)\$(COMPONENT)_dep\$(*F).det
  @if not $(ACTION)==remake if exist $(FIXPATH)\$(*F).d del /f /q$(FIXPATH)\$(*F).d >nul
  @if exist $(*F).via del /f /q $(*F).via
  要生成.o依赖于.c文件,如果我的.c文件经过更新,那么该.o就需要重新生成,该.c就需要重新来编译。
  @tools\strcmpex.exe $(ACTION) remake e$(*F).via $(CINTWORK) -c $(CFLAGS) $(CDEFS)$(CINCDIRS) -o $(COMPOBJS_DIR)/$@ $<
  @tools\strcmpex.exe $(ACTION) remake n $(*F).via $(CINTWORK) -c $(CFLAGS) $(CDEFS) $(CINCDIRS) $(MD) -o$(COMPOBJS_DIR)/$@ $<
  有两个编译环节,针对不同的编译动作,两者的不同点在于中间有个$(MD)编译选项,在有该选项的时间编译的时候就会生成依赖关系文件.d。
  @if not $(ACTION)==remake if exist $(FIXPATH)\$(*F).d perl.\tools\pack_dep.pl $(FIXPATH)\$(*F).d >$(RULESDIR)\$(COMPONENT)_dep\$(*F).det
  在这个的语句中有$(FIXPATH)\$(*F).d >$(RULESDIR)\$ (COMPONENT)_dep\$(*F).det该动作又将.d文件作为.pl文件的参数,执行该perl文件后将结果输出放在.det文件中。
  @if not $(ACTION)==remake if exist $(FIXPATH)\$(*F).d del /f /q$(FIXPATH)\$(*F).d >nul
  然后又执行这个语句,将.d文件删除。
  在make文件中可以看到-include$(RULESDIR)\$(COMPONENT).dep
  在查看各个.o的依赖关系的时间要查看该.dep文件来决定是否需要来重新编译生成该.o。
  如果新添加了.h文件又没有来更新.dep文件就可能导致该.o查找依赖时没有依赖该.h。不去更新该.o。
  @if exist $(FIXPATH)\$(CUS_MTK_LIB)\$(COMPONENT).lib \
  (copy /z $(FIXPATH)\$(CUS_MTK_LIB)\$(COMPONENT).lib $(subst/,\,$(TARGLIB))) &\
  ($(LIB) -r $(TARGLIB) $(COMPOBJS_DIR)/*.obj) \
  else \
  ($(LIB) -create $(TARGLIB) $(COMPOBJS_DIR)/*.obj)
  在生成了.o文件后在.lib的依赖中可以看到($(LIB) -r$(TARGLIB) $(COMPOBJS_DIR)/*.obj)
  该语句将生成的.o文件打包成.lib库文件。
  
  连接过程:$(BIN_FILE):
  最后完成编译:done:
  # -----------------------------
  # Clean temporary files in make directory
  # -----------------------------
  @echo Cleaning make\~*.tmp files ...
  @if exist make\~*.tmp \
  del make\~*.tmp
  @echo Done.
  @perl tools\time.pl -n
  清掉临时文件,打出done信息,最后打出时间标签。


本文来自CSDN博客,转载请标明出处:http://www.cnblogs.com/big_sky/admin/file:///F:/资料/mtk相关网络查询知识/MTK编译过程%20编译的流程怎么调用的.htm

posted @ 2010-03-09 09:49 菜鸟的宣言 阅读(716) 评论(0) 编辑

MTK编译过程之二

MTK 软件工程的配置说明 请下载我的资源《MTK软件工程和配置简介.doc》

本文详解MTK的编译过程,并会根据我的理解来更新。阅读上文对本文的一些文件和术语会有很好的帮助。

导读:
  Comp.mak 完成模块编译连接,生成bin
  Gsm2.mak 主编译文件,完成clean,remake,new等工作
  XXX_GPRS.mak 客户私有的配置,根据客户的不同,而设定不同的配置文件
  Option.mak 工程中的基本配置及宏定义文件
  Verno_XXX.bld 版本文件
  Custom.bld 要保证在客户版本中都使用相同的配置的地方要写在这里,这个里面的一些文件不能被改变
  第一步:
  1.Make.bat命令首先调用ChgFileMode.bat,将编译过程中需要用到的文件的只读属性修改为可读写,再调用make2.pl。
  2.Make2.pl的主要工作就是匹配gsm2.mak的参数,然后通过命令
  system("${makeCmd} -f${makeFolder}${myMF} -r -R CUSTOMER=$custom PROJECT=$project $action");来调用gsm2.mak。
  具体解析出来就是
  make -f make\gsm2.mak -r –R CUSTOMER=工程名 PROJECT=gprs new|update|remake
  第二步:整个过程如图
  Gsm2.mak
  Option.mak
  XXX_GPRS.mak
  REL_CR_MMI_GPRS.mak
  USER_SPECIFIC.mak
  
  1.在Gsm2.mak文件的开始处调用了option.mak文件。
  2.Option.mak又将make\$(strip $(CUSTOMER))_$(strip$(PROJECT)).mak文件包含进来,这个模式匹配结果为:make目录下,工程名称_GPRS.mak,如K500GSD_GPRS.mak。
  3.在$(strip $(CUSTOMER))_$(strip$(PROJECT)).mak文件中又调用了REL_CR_MMI_$(strip$(PROJECT)).mak文件,这个文件模式具体被解析为make目录下的REL_CR_MMI_GPRS.mak文件。
  REL_CR_MMI_GPRS.mak这个文件定义了哪些文件需要加入到编译目录中。
  其中定义了MMI部分的编译目录为MMIDIR = plutommi。
  在变量CUS_REL_BASE_COMP中定义了资源的编译目录:
  CUS_REL_BASE_COMP += $(strip $(MMIDIR))\mmi $(strip $(MMIDIR))\mtkapp $(strip$(MMIDIR))\tool $(MMIDIR)\WIN32FS
  CUS_REL_BASE_COMP += $(strip$(MMIDIR))\Customer\CustomerInc \
  $(strip $(MMIDIR))\Customer\Customize \
  $(strip $(MMIDIR))\Customer\CustResource\$(strip $(MMI_VERSION))\
  $(strip $(MMIDIR))\Customer\debug \
  $(strip $(MMIDIR))\Customer\Images\GameImages \
  $(strip $(MMIDIR))\Customer\Images\decoder \
  $(strip $(MMIDIR))\Customer\Res_MMI \
  $(strip $(MMIDIR))\Customer\ResGenerator \
  $(strip $(MMIDIR))\Customer\ResourceDLL \
  $(strip $(MMIDIR))\Customer\Resources \
  $(strip $(MMIDIR))\Customer\Audio
  客户的资源需要编译如下文件:CUS_REL_SRC_COMP += mmiresource mtkapp gdi_arm plutommi vendorapp
  图片名称为:CUS_REL_BASE_COMP += $(strip$(MMIDIR))\Customer\Images\$(strip $(MMI_PROJ))$(strip$(MAIN_LCD_SIZE)),可解析为如:
  plutommi\customer\images\K500GSD176X220
  
  REL_CR_MMI_$(strip $(PROJECT)).mak
  其中CUS_REL_OBJ_LIST这个变量存储了连接过程中所需要的文件名称
  
  4.make\$(strip $(CUSTOMER))_$(strip$(PROJECT)).mak文件的功能。
  CUSTOM_OPTION定义了所有需要编译进去的功能模块的宏。
  COMPLIST变量的功能:
  ifeq ($(strip $(RTOS)),NUCLEUS)
  COMPLIST = nucleus nucleus_int nucleus_ctrl_code nucleus_critical_data
  Endif
  如果操作系统为NUCLEUS,那么COMPLIST为后面的值,COMPLIST为所要编译的文件列表,里面存放了很多*.inc文件,展开后就变为
  config\include
  stacklib\include
  adaptation\include
  kal\include等等
  
  5. option.mak文件的在后面调用了make\USER_SPECIFIC.mak
  如果使用CPU为ARM,则编译工具目录为如下定义
  ifeq ($(strip $(COMPILER)),ADS)
  DIR_ARM = c:\progra~1\arm\adsv1_2
  DIR_ARM := $(strip $(DIR_ARM))
  DIR_TOOL = $(DIR_ARM)\bin
  DIR_ARMLIB = $(DIR_ARM)\lib
  DIR_ARMINC = $(DIR_ARM)\include
  Endif
  连接打包工具等为如下几个:
  DIR_TOOL := $(strip $(DIR_TOOL))
  LINK = $(DIR_TOOL)\armlink.exe # Linker
  ASM = $(DIR_TOOL)\armasm.exe # ARM assembler
  LIB = $(DIR_TOOL)\armar.exe # Library tool
  BIN_CREATE = $(DIR_TOOL)\fromelf.exe # Binary tool
  下面这段代码告诉我们需要用什么编译工具来编译
  ifeq ($(strip $(COMPILER)),ADS)
  ifeq ($(strip $(COMPILE_MODE)),INST16)
  CC = $(DIR_TOOL)\tcc.exe # Thumb Mode(16bits), use tcc
  CC32 = $(DIR_TOOL)\armcc.exe # ARM Mode(32bits), use armcc
  CPPC = $(DIR_TOOL)\tcpp.exe # Thumb Mode(16bits), use tcc
  CPPC32 = $(DIR_TOOL)\armcpp.exe # ARM Mode(32bits), use armcc
  else
  ifeq ($(strip $(COMPILE_MODE)),INST32)
  CC = $(DIR_TOOL)\armcc.exe # ARM Mode(32bits), use armcc
  CPPC = $(DIR_TOOL)\armcpp.exe # ARM Mode(32bits), use armcc
  else
  CC = $(DIR_TOOL)\tcc.exe # Default tcc
  CC32 = $(DIR_TOOL)\armcc.exe # ARM Mode(32bits), use armcc
  CPPC = $(DIR_TOOL)\tcpp.exe # Thumb Mode(16bits), use tcc
  CPPC32 = $(DIR_TOOL)\armcpp.exe # ARM Mode(32bits), use armcc
  endif
  endif
  endif
  
  ifeq ($(strip $(PLATFORM)),MT6223P)
  AFLAGS := -g -littleend -cpu ARM7EJ-S
  Endif
  
  COMMINCDIRS变量在先包含了基本功能模块的inc目录后再包含如下文件
  COMMINCDIRS += $(DIR_ARMINC) $(CUSTOM_COMMINC),
  
  6.Option.mak中定义了一些附加功能模块的编译模式(是否被编译,被编译成什么样的结果),比如说蓝牙,UART3,WIFI,USB,WAP等等,还有一些编译器的设置。
  我们的版本号和Scat文件被定义在这个变量中:5056L
  SCATTERFILE = custom\system\$(strip$(BOARD_VER))\scat$(strip $(PLATFORM)).txt
  VERNOFILE = make\Verno_$(CUSTOMER).bld
  .bin文件的名称设置在这个变量TARGNAME = $(CUSTOMER)_$(strip$(SUB_BOARD_VER))_$(PROJECT)_$(strip $(PLATFORM))_$(strip$(CHIP_VER))
  TST_DB := $(strip $(TSTDIR))\database_classb
  然后被包含到Option.mak文件中来,include $(strip$(VERNOFILE))。
  
  7.Gsm2.mak文件中new执行的指令
  new : cleanall cmmgen mmi_feature_check asngen codegen asnregen operator_check_lite update
  
  update所执行的指令
  update : cleanlog cleanbin mcddll_update codegen resgen cksysdrv remake
  
  remake所执行的指令
  remake : mcp_check cleanlog cleanbin genverno libs $(BIN_FILE) done
  
  resgen用来编译资源文件:Res_XXX.c
  
  (echo CUSTOM_OPTION = $(foreach def,$(BOARD_VER) $(PLATFORM) $(LCD_MODULE) $(EXT_CAM_MODULE)$(CMOS_SENSOR),-D "$(def)") \>$(MMIDIR)\customer\resGenerator\custom_option.txt)
  首先将CUSTOM_OPTION重定向到custom_option.txt中
  
  (type make\~cus_opt.tmp >>$(MMIDIR)\customer\resGenerator\custom_option.txt)
  使用tools\strcmpex.exe生成~cus_opt.tmp, ~tgt_opt.tmp,~inc.tmp三个文件
  将~cus_opt.tmp 重定向到custom_option.txt中
  
  (@del $(MMIDIR)\mmi\TargetOption.txt) &\
  (copy /Y make\~tgt_opt.tmp $(MMIDIR)\MMI\TargetOption.txt)
  再将TargetOption.txt更新一下,将~tgt_opt.tmp重定向到TargetOption.txt中
  
  (type make\~inc.tmp >$(MMIDIR)\customer\resGenerator\custom_include.tmp)
  再将~inc.tmp重定向到custom_include.tmp中,
  
  执行replace_project_name.pl文件,编译Res_XXX.c
  再执行ResGenerator_HW.bat,编译资源文件。
  
  8.Remake中的编译过程是在libs中完成的
  目标依赖:libs: cleanlib startbuildlibs $(COMPLIBLIST)
  Cleanlib在这个依赖中做的动作是清掉上次生成的.bin,.elf,.lis等文件,接着清掉需要重新来生成的.lib文件。$(COMPLIBLIST)这个依赖就是我们需要重新生成的.lib文件。
  .lib文件的依赖关系:%.lib:
  在这个依赖关系中所做的动作是设置编译器,链接器以及这个过程的参数等其他信息,然后将这些信息输出到:~compbld.tmp临时文件中。
  
  (tools\make.exe -fmake\comp.mak -k -r -R $(strip $(CMD_ARGU)) COMPONENT=$* >$(strip $(COMPLOGDIR))\$*.log) \
  调用了make命令来执行comp.mak文件,并且可以看到> $(strip$(COMPLOGDIR))\$*.log
  该语句将执行comp.mak文件时产生的信息存放在当前编译部分的.log文件中,通常看编译信息的比如custom.log等就是该中类型的文件。
  
  依赖关系:update_lib: $(TARGLIB)
  $(TARGLIB) : $(COBJS) $(CPPOBJS) $(AOBJS) $(ARMOBJS)
  $(TARGLIB)依赖很多.c和.obj
  .c.obj:
  @echo Compiling $< ...
  @tools\strcmpex.exe $(ACTION) remake e $(*F).via $(CINTWORK) -c $(CFLAGS) $(CDEFS) $(CINCDIRS) -o $(COMPOBJS_DIR)/$@$<
  @tools\strcmpex.exe $(ACTION) remake n $(*F).via $(CINTWORK) -c $(CFLAGS) $(CDEFS) $(CINCDIRS) $(MD) -o$(COMPOBJS_DIR)/$@ $<
  @if exist $(*F).via tools\warp.exe $(*F).via
  @if exist $(*F).via $(CMPLR) $(VIA) $(*F).via
  @if not $(ACTION)==remake if exist $(FIXPATH)\$(*F).d perl.\tools\pack_dep.pl $(FIXPATH)\$(*F).d >$(RULESDIR)\$(COMPONENT)_dep\$(*F).det
  @if not $(ACTION)==remake if exist $(FIXPATH)\$(*F).d del /f /q$(FIXPATH)\$(*F).d >nul
  @if exist $(*F).via del /f /q $(*F).via
  要生成.o依赖于.c文件,如果我的.c文件经过更新,那么该.o就需要重新生成,该.c就需要重新来编译。
  @tools\strcmpex.exe $(ACTION) remake e$(*F).via $(CINTWORK) -c $(CFLAGS) $(CDEFS)$(CINCDIRS) -o $(COMPOBJS_DIR)/$@ $<
  @tools\strcmpex.exe $(ACTION) remake n $(*F).via $(CINTWORK) -c $(CFLAGS) $(CDEFS) $(CINCDIRS) $(MD) -o$(COMPOBJS_DIR)/$@ $<
  有两个编译环节,针对不同的编译动作,两者的不同点在于中间有个$(MD)编译选项,在有该选项的时间编译的时候就会生成依赖关系文件.d。
  @if not $(ACTION)==remake if exist $(FIXPATH)\$(*F).d perl.\tools\pack_dep.pl $(FIXPATH)\$(*F).d >$(RULESDIR)\$(COMPONENT)_dep\$(*F).det
  在这个的语句中有$(FIXPATH)\$(*F).d >$(RULESDIR)\$ (COMPONENT)_dep\$(*F).det该动作又将.d文件作为.pl文件的参数,执行该perl文件后将结果输出放在.det文件中。
  @if not $(ACTION)==remake if exist $(FIXPATH)\$(*F).d del /f /q$(FIXPATH)\$(*F).d >nul
  然后又执行这个语句,将.d文件删除。
  在make文件中可以看到-include$(RULESDIR)\$(COMPONENT).dep
  在查看各个.o的依赖关系的时间要查看该.dep文件来决定是否需要来重新编译生成该.o。
  如果新添加了.h文件又没有来更新.dep文件就可能导致该.o查找依赖时没有依赖该.h。不去更新该.o。
  @if exist $(FIXPATH)\$(CUS_MTK_LIB)\$(COMPONENT).lib \
  (copy /z $(FIXPATH)\$(CUS_MTK_LIB)\$(COMPONENT).lib $(subst/,\,$(TARGLIB))) &\
  ($(LIB) -r $(TARGLIB) $(COMPOBJS_DIR)/*.obj) \
  else \
  ($(LIB) -create $(TARGLIB) $(COMPOBJS_DIR)/*.obj)
  在生成了.o文件后在.lib的依赖中可以看到($(LIB) -r$(TARGLIB) $(COMPOBJS_DIR)/*.obj)
  该语句将生成的.o文件打包成.lib库文件。
  
  连接过程:$(BIN_FILE):
  最后完成编译:done:
  # -----------------------------
  # Clean temporary files in make directory
  # -----------------------------
  @echo Cleaning make\~*.tmp files ...
  @if exist make\~*.tmp \
  del make\~*.tmp
  @echo Done.
  @perl tools\time.pl -n
  清掉临时文件,打出done信息,最后打出时间标签。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/dragoniye/archive/2008/12/04/3445134.aspx


 

posted @ 2010-03-09 09:40 菜鸟的宣言 阅读(861) 评论(0) 编辑

MTK Modis 使用简介[转]

Modis PC仿真, 要进行如下操作:(假设工程路径为D:\X)
第一步:在如下目录中D:\X
执行  make Prj_Name GPRS gen_modis

第二步: 转到modis目录 D:\X\modis执行
createmodis.pl ..\make\Prj_Name_GPRS.mak

第三步:再切换到 D:\X
执行  make Prj_Name GPRS codegen_modis

第四步:最后转到D:\X\modis目录

执行   modiscodegen.pl ..\make\Prj_Name_GPRS.mak


第五步:开始使用Modis仿真--运行D:\X\modis\Modis.dsw,编译工程;

第六步:启动Modis->开机->Option->Luanch Catcher&NS,这样就可以进行模拟操作并从catcher中得到日志;

        注意:老版本的Catcher下出现NS不能控制的情况。

每次改个东东都要ResGenerator.bat来编译

tools\chk_env 验证是否编译环境是否好了。

make Project gen_modis
make Project codegen_modis

可以自己写一个批处理文件,后面就比较的好生成

@echo off
rem *************************************************************************
rem
rem   rem
rem   DESCRIPTION
rem      MT6225_gemini project master build batch file
rem
rem  Author   Date   Description
rem 

rem
rem *************************************************************************
@echo off
rem -----------------------------
rem Check release project
rem -----------------------------
if %1%0==%0 goto help
if %1%0==help%0 goto help
if %1%0==/?%0 goto help

if %1== new     goto PROJ_NAME
if %1== update   goto PROJ_NAME
if %1== remake   goto PROJ_NAME
if %1== label_build  goto PROJ_NAME
if %1== clean   goto PROJ_NAME
if %1== get    goto PROJ_NAME
if %1== codegen   goto PROJ_NAME
if %1== emigen   goto PROJ_NAME
if %1== emiclean  goto PROJ_NAME
if %1== new_modis  goto PROJ_NAME
rem <modis step1>
if %1== gen_modis  goto PROJ_NAME
rem <modis step2>
if %1== codegen_modis goto PROJ_NAME

echo 第一个参数错误!
echo 查看帮助请执行:do 或 do help 或 do /?
goto end

rem *************************************************************************
rem void JinMa-01( void )
rem *************************************************************************
:PROJ_NAME
 echo *** Start building project PROJ_NAME(%1) ***
 call Make.bat custom=PROJ_NAME gprs %*
  goto end


rem *************************************************************************
rem void help( void )
rem *************************************************************************
:help
echo.
echo Help:
echo     do "action" ["build_label"/"modules"]
echo.
echo     action         = new             (clean, scan, codegen, compile, link) (default)
echo                    = update          (scan, compile, link)
echo                    = remake          (compile, link)
echo                    = label_build     (clean, retrieve, scan, compile, link)
echo                    = clean           (clean)
echo                    = get             (retrieve)
echo                    = codegen         (codegen)
echo.
echo     build_label    = version label (e.g., ) [Case sensitive](OPTIONAL)
echo.
echo     modules        = component module name (nucleus, l1, ...)(OPTIONAL)
echo.
pause
echo     Example:
echo        do new
echo        do codegen       
echo        do update
echo        do update drv       
echo        do update init custom
echo        do remake
echo        do remake init    
echo        do remake custom drv
echo        do clean
echo        do clean  init
echo        do clean  init custom drv
echo.
goto end


:end
call tools\time1
echo build end

当然你要保证你的make2.pl里面关于编译器"cl"等路径是否正确

------------------------------------------------------------------
1)Generate MoDIS (modis.dsw & modis.dsp) 指令
    mcu 指的是source 的根目錄
    "mcu\make easyinfor23_07a_pmjgprs gen_modis"
2)Codegen MoDIS (產生所MoDIS需的Database)
    "mcu\make easyinfor23_07a_pmj gprs codegen_modis"
3)Build MoDIS
    1.使用VC++ 6.0 開啟MoDIS.dsw, build ..
    2. or "mcu\make <-release/-debug> easyinfor23_07a_pmj gprs <clean_modis/remake_modis>"

而第一次build MoDIS的話,以上三個步驟可由下面command 一次全部做完
"mcu\make easyinfor23_07a_pmj gprs new_modis"

若是只是修改字串or image的話,只要執行step 3即可
 
就是生成的modis vc工程中的dsw 和 dsp
---------------------------------------------------------------------
make easyinfor23_07a_pmj gprs new  重新编译
make easyinfor23_07a_pmj gprs resgen 编译资源
make easyinfor23_07a_pmj gprs r  只编译修改文件

修改完字符串或图片资源需要使用如下的命令使之应用:
make easyinfor23_07a_pmj gprs resgen
make easyinfor23_07a_pmj gprs r mmiresource

如果只想编译某个模块,如plutommi,则可以使用如下命令:
make easyinfor23_07a_pmj gprs r plutommi

要编译模拟器前,需要输入编译命令
make EASYINFOR23_07A_PMJ GPRS gen_modis
make EASYINFOR23_07A_PMJ GPRS codegen_modis
------------------------------------------------------------------
我用VC编译模拟器时出现了下面的错误:
Creating library...
--------------------Configuration: PC_Simulator - Win32 Debug--------------------
Compiling...
PC_Simulator.cpp
MMITask.c
e:\5602-nogps-nojava\plutommi\mmi\framework\tasks\taskssrc\mmitask.c(2018) : warning C4101: 'rsp_msg' : unreferenced local variable
e:\5602-nogps-nojava\plutommi\mmi\framework\tasks\taskssrc\mmitask.c(2351) : warning C4013: 'InitTime' undefined; assuming extern returning int
e:\5602-nogps-nojava\plutommi\mmi\framework\tasks\taskssrc\mmitask.c(2891) : warning C4013: 'LoadIPNumbers' undefined; assuming extern returning int
e:\5602-nogps-nojava\plutommi\mmi\framework\tasks\taskssrc\mmitask.c(2897) : warning C4013: 'LoadBlackListNum' undefined; assuming extern returning int
Linking...
  Creating library Debug/PC_Simulator.lib and object Debug/PC_Simulator.exp
LIBCD.lib(crt0init.obj) : warning LNK4098: defaultlib "libc.lib" conflicts with use of other libs; use /NODEFAULTLIB:library
MMI.lib(MiscFunctions.obj) : error LNK2001: unresolved external symbol _GPIO_WriteIO
MMI.lib(MiscFunctions.obj) : error LNK2001: unresolved external symbol _GPIO_InitIO
MMI.lib(MiscFunctions.obj) : error LNK2001: unresolved external symbol _GPIO_ModeSetup
MMI.lib(Events.obj) : error LNK2001: unresolved external symbol _TurnOffLED
MMI.lib(Events.obj) : error LNK2001: unresolved external symbol _TurnOnLED
MMI.lib(IdleApp.obj) : error LNK2001: unresolved external symbol _GTS_COMMON_CloseActiveGame
MMI.lib(IdleApp.obj) : error LNK2001: unresolved external symbol _GTS_COMMON_GetActiveGameID
MMI.lib(mdi_audio.obj) : error LNK2001: unresolved external symbol _GTS_COMMON_GetActiveGameID
MMI.lib(SoundEffect.obj) : error LNK2001: unresolved external symbol _earphone_magnitude
MMI.lib(MainMenu.obj) : error LNK2001: unresolved external symbol _mmi_java_start_hexin
MMI.lib(VdoPlyApp.obj) : error LNK2001: unresolved external symbol _vdo_sfmp4_is_active
MMI.lib(VdoPlyApp.obj) : error LNK2001: unresolved external symbol _lcd_power_down
MMI.lib(VdoPlyApp.obj) : error LNK2001: unresolved external symbol _kal_prompt_trace
MMI.lib(PhoneBookStubsToOthers.obj) : error LNK2001: unresolved external symbol _mmi_phb_quick_search_list_pre_entry
MMI.lib(AudioPlayerSrc.obj) : error LNK2001: unresolved external symbol _g_usb_just_plug_out
MMI.lib(Game.obj) : error LNK2001: unresolved external symbol _GTS_Fish_Entry
MMI.lib(Game.obj) : error LNK2001: unresolved external symbol _GTS_Ramiel_Entry
MMI.lib(Game.obj) : error LNK2001: unresolved external symbol _GTS_Minatour_Entry
MMI.lib(Game.obj) : error LNK2001: unresolved external symbol _GTS_Tianshan_Entry
MMI.lib(Game.obj) : error LNK2001: unresolved external symbol _mmi_gx_qq_enter_gfx
MMI.lib(wgui_fixed_menuitems.obj) : error LNK2001: unresolved external symbol _GetImageIconHight
Debug/PC_Simulator.exe : fatal error LNK1120: 20 unresolved externals
执行 link.exe 时出错.

缺少一些库的支持,链接需要的这些库链接器找不到,问题一般有两个,一是缺少这些库文件,比如GTIO或GTS等,二是makefile文件中链接选项没有加入库文件名。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ray_xie156/archive/2009/12/16/5020333.aspx

posted @ 2010-03-09 09:35 菜鸟的宣言 阅读(2428) 评论(0) 编辑

MTK编译环境搭建内容之二

一.安装编译工具

1.            ADS1.2和ADS1.2_update_848.exe,mtk是arm7核的,所以用ads编译当然会比较好一点,当然应该是可以用其他编译器的,但不想去试,太麻烦了。到网上下了这两个软件,装上。注意:最好是按默认目录安装。不然后面还得有事做,按默认目录装可以省事不少!

2.            安装perl,mtk编译脚本是用perl来完成的。

3.              到了这里,很多时候应该是可以了。因为很多release版本的源代码已经有其它第三方工具了。你先检查一下有没有下面的工具,如果没有就装。MSYS 版本:1.0.10,MinGW 版本:3.1.0,Gcc-core-3.3.1,Gcc-g++-3.3.1,ImageMagick 版本:6.3.6 Q16,7-zip 版本:3.13。注意:版本最好是要求的版本,这些是已经通过测试的不会有问题。

4.              朋友可能是想考验我,把一个工具删除了,害我一开始编译不了。这个工具是convert.exe提示找不到这个文件。后来装了,ImageMagick后,把convert.exe放在\plutommi\Customer\ResGenerator里面就行了。

 

二.测试开发环境

1.  进入DOS命令提示行里

2.  进入你源代码目录下的tools目录

3.  运行chk_ev.exe,如果你看到“Build environment is ready!”的提示说明你的编译环境好了

 

三.开始编译

     1.在编译手机程序,在源代码的根目录里输入make –h可以看到编译帮助下面是我这里的提示:

Usage:

  make ["customer"|"mt62xx"] "project" "action" ["modules"]

 

Description:

  customer   = mtk             (Default customer)

             = firefly17_demo  (FIREFLY17_DEMO project)

             = [mt6217|mt6219|mt6226|mt6227|mt6228|mt6229] (EVB only)

             = ...

 

  project    = l1s             (Layer 1 stand-alone)

             = gsm             (GSM only)

             = gprs            (GPRS only)

             = basic           (Basic Framework)

 

  action     = new             (codegen, resgen, clean, update) (default)

             = update or u     (scan, compile, link)

             = remake or r     (compile, link)

             = clean or c      (clean)

             = resgen          (resgen)

             = c,u             (clean then update)

             = c,r             (clean then remake)

             = codegen         (codegen)

             = viewlog         (open edit to view build log)

 

  module(s)  = modules' name   (kal, l1, ...)

   => OPTIONAL when action is one of (clean c remake r update u c,r c,u)

 

Example:

  make gsm new                         (MT6205B EVB new)

  make gprs codegen                    (MT6218B EVB codegen)

  make mt6219 gprs update              (MT6219 EVB update)

  make firefly17_demo gprs new

  make milan_demo gprs c,u init custom

  make mt6219 gprs r init custom drv

也就是说只要输入make XXX gprs new之类的命令就可以编译了,这里XXXX指你的项目名。

   2.模拟器的编译。

     模拟器的编译是用VC来编译的,编译好后会生成一个exe的文件,你可以直接运行它来模拟手机的运行了。用VC6打开,\plutommi\mmi目录下的pixtelmmi.dsw然后编译。注意:两个项目都要编译

 

四.运行

我没有硬件运行它,所以只在pc上模拟运行,

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ray_xie156/archive/2009/12/16/5020367.aspx

posted @ 2010-03-09 09:33 菜鸟的宣言 阅读(1531) 评论(0) 编辑

MTK程序编译环境搭建之一

MTK程序编译

                                          

1.   编写目的

本文编写的目的主要是从整体上理解MTK的编译过程,以便较快的处理编译中遇到的问题,同时为以后可能的优化编译过程提供参考。

 

2.   简介

MTK的编译过程主要是在windows命令行下通过Makefile文件执行相应的prel脚本或c程序,将资源包生成c源程序,并与相应模块的c程序.o,.lib或.obj的中间代码,最终生成在手机上使用的.bin文件和在模拟器上使用的mmiresource.dll资源文件。

 

3.   编译环境

A.      编译工具和辅助工具

l        ADS1.2

l        ADS1.2_update_848.exe

l        MSYS 版本:1.0.10

l        MinGW 版本:3.1.0

l        Gcc-core-3.3.1

l        Gcc-g++-3.3.1

l        ImageMagick 版本:6.3.6 Q16

l        7-zip 版本:3.13

l        注意:按照联发科技的要求,最好上述软件采用建议的版本,否则可能会出现异常情况,导致不能正常编译。

B.      编译环境搭建

l        按默认路径安装ADS1.2,并安装848补丁包

l        按默认路径安装Perl

l        按默认路径安装7_zip

l        安装MinGW

先按默认路径安装MinGW安装包,然后解压gcc-core、gcc-g++的压缩包,讲解压后的两个文件夹复制到MinGW安装路径下。

l        安装MSYS

l        安装ImageMagick,注意:

按默认提示安装到Select Additional Tasks时,所有的选择全取消,后面再按默认安装。

l        复制7z.exe

拷贝..\7_Zip\7z.exe 至..\plutommi\Customer\ResGenerator,并改名为7za.exe。

l        复制MinGW

拷贝..\MinGW至..\Tools\MinGW。

l        复制MSYS

拷贝..\msys\1.0至..\Tools\MSYS。

l        复制ImageMagick

拷贝..\ImageMagick-6.2.5-Q16文件夹下全部文件

至  ..\plutommi\Customer\ResGenerator目录下

l        设置make.exe

改名mingw32-make.exe(..\Tools\MinGW)为make.exe,并放在tools目录下。

C.      编译环境检查

l        检查第三方软件安装情况

如果确认全部安装,可跳过此步。

将custom3rdParty.pl文件拷贝到本机,修改

4$sevenZipPath = "C:\\Progra1~1\\7-Zip";

       5$MinGWPath    = "C:\\MinGW";

       6$MSYSPath     = "C:\\MSYS";

然后运行在Tools\chk_env.exe

l        检查windows环境变量

l        检查MTK中Makefile变量是否正确

打开..\make\option.make,检查关于ADS编译器的路径设置

ifeq ($(strip $(COMPILER)),ADS)

        DIR_ARM        =  c:\adsv1_2

        DIR_ARM := $(strip $(DIR_ARM))

        DIR_TOOL       =  $(DIR_ARM)\bin

        DIR_ARMLIB     =  $(DIR_ARM)\lib

        DIR_ARMINC     =  $(DIR_ARM)\include

Endif

D.      结束

现在可以执行MAKE了,例如

Make customer_name gprs new_modis

Make CUSTOMER_NAME gprs new

E.      搭建编译环境的另一种方法

正确安装A中所述软件后,配置custom3rdParty.pl中变量,用该批处理文件自动配置剩余工作。

F.  搭建编译环境的一种捷径

当已经配置好一个MTK工程,需要在另一个工程中搭建编译环境时,有一种便捷的方法,步骤如下:

l    假设已配置好的工程MAUI.A,待配置的是MAUI.B;

l    备份MAUI.B的tools目录,如改名为tools_new;

l    复制MAUI.A的tools目录至MAUI.B的目录下;

l    用MAUI.B原来的tools目录下所有文件覆盖当前的tools目录,如复制tools_new下所有文件至tools下;

l    复制MAUI.A下plutommi/Customer/ResGenerator/7za.exe和convert.exe至MAUI.B下的plutommi/Customer/ResGenerator。

 

4.   编译命令与文件

MTK编译分资源的编译和代码的编译。

1)      资源的编译

a)      在如下的情况下,需要重新编译资源:

l        修改了字符串资源文件(Ref_list.txt)、字库文件(FontRes.c,L_**.h)、MMI配置文件(MMI_featuresPLUTO.h)等,这些文件位于

..\plutommi\Customer\CustResource\PLUTO_MMI\  ;

l        修改了MMI资源装载配置文件,这些文件位于

..\plutommi\Customer\CustResource\PLUTO_MMI\Res_MMI 目录下,这个目录下都是Res_*.*文件,是各个AP或模块的资源装载文件,包括菜单、图片和字符串资源的装载配置;

l        注意:Cust*.*文件是资源编译生成的,不能手动修改。

b)      编译方法

进入..\plutommi\Customer目录,执行remakeResource.bat。若是在模拟器上使用,则还需要在VC环境下build一下,就可以看到效果了。

c)      与资源编译相关的文件

l        ResGenerator_HW.bat

在编译手机目标板工程时,有“new”,“resgen”等选项时,自动调用;

l        ResGenerator.bat

手机PC模拟器工程中,添加新资源后,需要手动调用;

l        remakeResource.bat

手机PC模拟器工程中,只替换图片或更新字符串等情况下,需要手动调用;

l        res_gen.txt

资源编译的log文件,在build目录下;

l        Makefile

..\plutommi\Customer\ResGenerator\Makefile

此文件是资源装载预编译程序的Makefile;

l        PopulateRes.c

..\plutommi\MMI\Resource\PopulateRes.c

执行资源装载,主体是函数PopulateResData(),

mtk_resgenerator.exe在执行时会调用该函数;

l        MMIDataType.h

..\plutommi\mmi\Inc\MMIDataType.h

定义AP的ID范围。

2)      代码的编译

A.      编译命令

命   令
 说 明
 
Clean
 清除所有的目标文件、库文件和日志文件,保留目录结构
 
New
 清除并重新编译所有的文件

主要完成工作 gsm2.mak

cleanall cmmgen mmi_feature_check asngen codegen asnregen operator_check_lite update
 
Update
 扫描资源、代码的改变,有改变的重编,无改变的不编

主要完成的工作 gsm2.mak

cleanlog cleanbin mcddll_update codegen resgen cksysdrv remake
 
Remake
 不扫描资源,只扫描代码的改变,有改变的重编,无改变的不编

主要完成的工作 gsm2.mak

mcp_check cleanlog cleanbin genverno libs $(BIN_FILE) done
 
 
 
 


B.      编译相关的文件

编译用到的文件主要放在make文件夹中。各个文件的简要说明如下:

文件名
 说 明
 
Gsm2.mak
 编译过程中主要执行的make文件,这个文件从命令行获得编译参数,做出相应的处理。它定义了各个参数的执行过程,包括:new、remake、update等。以及调用其它perl或c程序生成目标文件。
 
Option.mak
 定义了编译环境中用到的工具及相关的目录,根据大的编译开关定义了小的编译和链接选项。
 
XXX.lis
 XXX模块的.c文件

如 plutommi\MMI\MyApp\MyAppSrc\MyAppSrc.c
 
XXX.pth
 XXX模块的.c文件存放的路径

如 plutommi\MMI\MyApp\MyAppSrc
 
XXX.def
 XXX模块用到的编译开关,当XXX模块引用其它模块中在编译开关下定义的变量、函数或宏时,就需要将这个编译开关加进来。
 
XXX.inc
 XXX模块用到的头文件路径,需要将XXX模块引用的头文件及,头文件引用的头文件的路径均要包含进来。

如 plutommi\MMI\MyApp\MyAppInc
 
XXX_GPRS.mak
 定义了需要编译的模块列表、编译中包含文件和生成文件的路径,定义trace的头文件路径,全局的编译开关,用户的一些编译选项,最后定义了编译路径和目录。用户可以在这个文件中定义配置。
 
Comp.mak
 编译和集成模块源文件,编译生成库文件。构建目标代码依赖列表,设置每个模块的编译路径及编译选项,设置生成目标lib的路径,设置生成obj的路径。
 
~buildinfo.tmp
 包含了在Gsm2.mak和Option.mak中用到的项目和平台名称。
 
~compbld.tmp
 包含了编译每个模块时的编译信息。
 
目标文件
 生成的目标文件为.bin文件,位于..\build\proj目录下面,build目录为生成的一个目录。
 
Log文件
 Log文件同.bin文件一样,也是位于build目录下,如果编译出错,可以在命令行中看到出错的模块,然后到build目录下找对应的Log文件。
 
MT6225r目录
 包括了每个模块的依赖文件(由mak产生的.dep)。
 
MT6225o目录
 包含所有生成的obj文件和lib文件。
 


 

C.      文件命名规则

一般来说MMI程序在plutommi\mmi或者mtkapp下面,程序源文件及头文件命名有一定的规律。

以工具箱模块为例,有三个相关目录。

Organizer                   程序总目录

OrganizerInc                头文件目录

OrganizerSrc                源文件目录

    在OrganizerSrc下创建源程序文件

Ebook2.c

    在OrganizerInc下创建程序头文件

       EbookProt.h

       EbookDefs.h

       EbookTypes.h

       EbookGprot.h

    下面介绍每个文件的作用:

u      **Src.c/**.c

本程序的主源程序

u      **Gprot.h

用来放本程序的所有函数声明,但此头文件是被别的程序所加载的,也就是说此文件所申明的都是对外接口;

u      **Gtype.h

用来放本程序所需的类型、结构、常量宏定义,此头文件同时被别的程序所加载;

u      **Gdcl.h

包括被其它程序调用的全局变量定义;

u      **Gexdcl.h

包括全局变量的声明,该头文件被别的程序所加载;

u      **Prot.h

用来放本程序的所有函数声明,但此头文件只被本程序的源程序所加载;

u      **Dcl.h

定义仅被本程序所调用的全局变量;

u      **ExDcl.h

包括全局变量的声明,但此头文件只被本程序的源程序所加载;

u      **Types.h

用来放本程序所需的类型、结构、常量定义;

u      **Def.h

用来放本程序的资源ID定义;

u      *.*

也可以自己定义程序的命名规则。

 

5.   配置编译选项

XXX_GPRS.mak是用户配置文件,用户可以通过修改该文件配置编译选项。

1)      增减编译的模块

牵涉到XXX_GPRS.mak中的两个变量:

l        COMPLIST

列出所有可以被编译成.lib库文件的模块。

当在COMPLIST中增加编译的模块时,注意要在make下相应的目录中创建相应的.lis,.inc,.path,.def文件。

l        CUS_REL_MTK_COMP

列出所有只提供.lib库文件的模块。

这些库文件要位于../mtk.lib中。

2)      将含有源文件的模块以库文件的形式编译

l        从COMPLIST中去除该模块;

l        将该模块加入CUST_REL_MTK_COMP;

l        将.lib库文件拷贝至../mtk.lib中;

l        删除make下相应的模块目录。

3)      配置编译MoDIS

MoDIS作为MTK软件开发的重要工具,常常被使用。但是由于在PC端与手机端不可避免存在一定的区别,因此在编译MoDIS时,其配置选项有一些与手机端编译存在一定的区别。

在配置好手机端编译的基础上,相应MoDIS的配置还牵涉到:

l        CreateMoDIS.ini

l        Module.ini

l        CreateMoDIS.pl

以下分别介绍这三个文件

a)      CreateMoDIS.ini

MoDIS的全局配置,有7个部分配置编译:

²       GLOBAL_SETTING

变量disbale_libs关闭MoDIS编译中不需的手机端模块,例如bootloder模块,此模块在手机端上用于引导系统,但是在MoDIS上,由于并不是真实的目标板环境,因此该模块需要取消。

变量enable_libs增加MoDIS编译中所独有的模块,例如modis_fs,由于采用了模拟的文件系统,因此在disbale_libs中加入fs模块后,在enbale_libs上加入modis_fs。

²       ENABLE_INC_PATH/ DISABLE_INC_PATH

增加或减少头文件的搜索路径,其中global为全局路径,其他为相应模块的路径。

²       ENABLE_OPTION/ DISABLE_OPTION

增加或减少宏定义,其中global为全局宏,其他为相应模块或文件的宏。

²       ENABLE_FILE/ DISABLE_FILE

增加或减少相应模块的文件。

b)      Module.ini

MoDIS目录下各模块都有.ini文件,通过此类文件,用户可以修改相应模块编译时的头文件搜索路径、宏定义选项。

c)      CreateMoDIS.pl

编译MoDIS的批处理文件,在修改一些模块,如增加国笔时需要修改。

 

6.   常见编译错误

1)      mtk_resgenerator.exe不能正常运行。可能是ResGenerator文件夹中的某些文件有错误。一个原因是在ResGenerator文件夹中缺少temp.rgb这个文件,并且不能自动生成。

2)      240X320屏的Font_res.c文件的错误,因为打开了中文字体的编译开关,只需要将mmi_featurespluto.h文件中__MMI_LANG_SM_CHINESE__的编译开关关闭即可。

3)      出现以下错误,"plutommi\mmi\FunAndGames\FunAndGamesSrc\Game.c", line 349: Error: C2455E: array [0] found

"plutommi\mmi\FunAndGames\FunAndGamesSrc\Game.c", line 350: Error: C2455E: array [0] found

因为默认的240X320屏幕打开的关于游戏的编译开关下没有游戏,所以需要打开mmi_featurespluto.h文件中的__MMI_GAME_VSMJ_240x320__编译开关。

4)      现象:mmiresource模块生成错误:

"plutommi\Customer\custresource\custimgmapext.c", line 31: Error: C2456E: undeclared name, inventing 'extern int MAX_IMAGE_IDS'

"plutommi\Customer\custresource\custimgmapext.c", line 31: Serious error: C2958E: illegal in constant expression: non constant 'MAX_IMAGE_IDS'

plutommi\Customer\custresource\custimgmapext.c: 0 warnings, 1 error, 1 serious error

原因:改变了屏幕大小后,128X160目录下的图片资源有问题。

解决办法:更换128X160目录下的图片资源,重新编译此模块。

5)      现象:Free clusters are NOT enough . Check ckSysDrv.log for detail !

    Tools\make.exe: *** [cksysdrv] Error 1

   解决办法:删除掉\custom\system\CCDH26_05C_BB目录下的

    custom_EMI.c

custom_EMI.h

flash_opt.h

三个文件。

6)      现象:在新加模块的.c文件中引用一个b.h,产生b.h中的aaa变量没有定义的错误,具体错误如下:

    原因:没有包含定义aaa变量的头文件a.h。

    解决办法:在include b.h之前include a.h

7)      现象:"plutommi\Customer\custresource\CustImgDataHW.h", line 19361: Serious error: C2934E: duplicate definition of '________CUSTOMER__IMAGES__EMPTYIMAGE_BMP'

    原因:

    解决办法:删掉CustImgDataHW.h这个文件重新编译

8)      现象:在链接bin文件时,出现以下错误:

Error: L6218E: Undefined symbol custom_setAdvEMI (referred from bootarm.obj).

原因:custominfo.pl文件没有修改,默认只打开CCDH26_05C_GPRS.mak一 个文件,并不打开其它定义编译开关的文件,导致custom模块中的有些文 件没有编译,所以一些变量在最后链接时显示未定义。

    解决办法:修改custominfo.pl文件。

9)      现象:编译某个模块,出现错误:

Error: L6218E: Error: C2933E: type disagreement for 'mmi_phb_info_entry_list'

原因:调用mmi_phb_info_entry_list函数时传递的参数不正确,或者是函数mmi_phb_info_entry_list在调用时还未定义。

    解决办法:修改custominfo.pl文件。

10)  现象:编译时出现字符串未定义的错误,

enum_list.h:2046:

error: `STR_ENTERTAINMENT_EXPLAIN_WOMANKNOWLEDGE' undeclareere (not in a function)

原因:可能是编译开关没打开,或者是正在使用excel表,readexcel.c中没有添加相关的头文件。还有一种可能是在使用这个字符串ID的模块的make底下的.inc文件中没有将定义这个字符串的头文件路径加上。还要注意防止头文件引用的宏定义是不是重复。

11)  现象:执行ResGenerator.bat时到输出第一份记录文本文件时当机,并且每次都过不去。

原因:安装了Windows的更新程序导致的,具体的可能是因为两个原因,一是安装了MSN最新版的补丁,也有可能是安装了SP3补丁所致。

 

7.   参考资料

1.      MediaTek.  Maui MakeBuild Design[R].   台湾,2006.

2.      MediaTek.  SOP Third Party PackPage Installation[R]. 台湾,2007.

3.      傅贵.  MMI实例培训教程[R]. 成都,2006.

4.      王仲.  MTK资源分析[R].  南京:**公司南京研究所,2008.


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ray_xie156/archive/2009/12/16/5020417.aspx

posted @ 2010-03-09 09:28 菜鸟的宣言 阅读(2142) 评论(0) 编辑

2010年2月4日 #

指针解析详细[摘录csdn—blog]

右左法则是一个既著名又常用的方法。不过,右左法则其实并不是C标准里面的内容,它是从C标准的声明规定中归纳出来的方法。C标准的声明规则,是用来解决如何创建声明的,而右左法则是用来解决如何辩识一个声明的,两者可以说是相反的。右左法则的英文原文是这样说的:
The right-left rule: Start reading the declaration from the innermost parentheses, go right, and then go left. When you encounter parentheses, the direction should be reversed. Once everything in the parentheses has been parsed, jump out of it. Continue till the whole declaration has been parsed.


这段英文的翻译如下:

右左法则:首先从最里面的圆括号看起,然后往右看,再往左看。每当遇到圆括号时,就应该掉转阅读方向。一旦解析完圆括号里面所有的东西,就跳出圆括号。重复这个过程直到整个声明解析完毕。

        笔者要对这个法则进行一个小小的修正,应该是从未定义的标识符开始阅读,而不是从括号读起,之所以是未定义的标识符,是因为一个声明里面可能有多个标识符,但未定义的标识符只会有一个。

        现在通过一些例子来讨论右左法则的应用,先从最简单的开始,逐步加深:

int (*func)(int *p);

首先找到那个未定义的标识符,就是func,它的外面有一对圆括号,而且左边是一个*号,这说明func是一个指针,然后跳出这个圆括号,先看右边,也是一个圆括号,这说明(*func)是一个函数,而func是一个指向这类函数的指针,就是一个函数指针,这类函数具有int*类型的形参,返回值类型是int。

int (*func)(int *p, int (*f)(int*));

func被一对括号包含,且左边有一个*号,说明func是一个指针,跳出括号,右边也有个括号,那么func是一个指向函数的指针,这类函数具有int *和int (*)(int*)这样的形参,返回值为int类型。再来看一看func的形参int (*f)(int*),类似前面的解释,f也是一个函数指针,指向的函数具有int*类型的形参,返回值为int。

int (*func[5])(int *p);

func右边是一个[]运算符,说明func是一个具有5个元素的数组,func的左边有一个*,说明func的元素是指针,要注意这里的*不是修饰func的,而是修饰func[5]的,原因是[]运算符优先级比*高,func先跟[]结合,因此*修饰的是func[5]。跳出这个括号,看右边,也是一对圆括号,说明func数组的元素是函数类型的指针,它所指向的函数具有int*类型的形参,返回值类型为int。


int (*(*func)[5])(int *p);

func被一个圆括号包含,左边又有一个*,那么func是一个指针,跳出括号,右边是一个[]运算符号,说明func是一个指向数组的指针,现在往左看,左边有一个*号,说明这个数组的元素是指针,再跳出括号,右边又有一个括号,说明这个数组的元素是指向函数的指针。总结一下,就是:func是一个指向数组的指针,这个数组的元素是函数指针,这些指针指向具有int*形参,返回值为int类型的函数。

int (*(*func)(int *p))[5];

func是一个函数指针,这类函数具有int*类型的形参,返回值是指向数组的指针,所指向的数组的元素是具有5个int元素的数组。

要注意有些复杂指针声明是非法的,例如:

int func(void) [5];

func是一个返回值为具有5个int元素的数组的函数。但C语言的函数返回值不能为数组,这是因为如果允许函数返回值为数组,那么接收这个数组的内容的东西,也必须是一个数组,但C语言的数组名是一个右值,它不能作为左值来接收另一个数组,因此函数返回值不能为数组。

int func[5](void);

func是一个具有5个元素的数组,这个数组的元素都是函数。这也是非法的,因为数组的元素除了类型必须一样外,每个元素所占用的内存空间也必须相同,显然函数是无法达到这个要求的,即使函数的类型一样,但函数所占用的空间通常是不相同的。

        作为练习,下面列几个复杂指针声明给读者自己来解析,答案放在第十章里。

int (*(*func)[5][6])[7][8];

int (*(*(*func)(int *))[5])(int *);

int (*(*func[7][8][9])(int*))[5];

        实际当中,需要声明一个复杂指针时,如果把整个声明写成上面所示的形式,对程序可读性是一大损害。应该用typedef来对声明逐层分解,增强可读性,例如对于声明:

int (*(*func)(int *p))[5];

可以这样分解:

typedef  int (*PARA)[5];
typedef PARA (*func)(int *);

这样就容易看得多了。

const一词是英文constant的缩写,设立这个关键字的本意,是希望让它所修饰的对象成为一个常量。记得在国家间的外交中,有一个经常用到的术语:“从事与身份不符的活动”,这个const恰恰也正从事着这样的活动,呵呵。C语言可以有三种方法定义一个常量:#define、const和枚举,但只有枚举才是真正的常量,什么是真正的常量?真正的常量是没有存储空间的,是一个右值,这意味着通过任何合法的手段也不会被修改,但被const修饰的对象依然是一个左值,尽管这个对象被const限定,笔者仍然至少可以找到三种合法的手段去修改它,而#define所做的只不过是编译期替换而已,只有枚举常量才能真正做到这一点。const实在不应该被命名为const,这会让人们产生误解,它应该命名为readonly或类似的字眼,意即不能通过被const修饰的对象修改它所指向的对象或者它所代表的对象。但在C的世界里把const称为常量早已是普遍的现象,那我们就只好随大流咯,也称之为常量吧,只要知道它实际上不是真正的常量就行了。

        第七章曾经讨论过const int *p;与int * const p的区别,这两个声明的中文名称常常搞得混乱不堪。第一个声明的const是声明说明符,它修饰p所指向的对象,但p仍然是可变的,这意味着p是一个指向常量的指针,简称常量指针。第二个声明的const是声明符的一部分,它修饰的对象是p,这意味着p是一个常量,而且是一个指针类型的常量,简称指针常量。指针常量又常常被人称为“常指针”或“常指针变量”,常指针变量这个名称有点蹩脚,又常又变的,容易让人摸不着头脑,最好还是不要这样称呼。这里还得再强调一次指针常量与地址常量是不同的,不能把数组名称为指针常量,也不能把指针常量称为地址常量,因为指针常量依然是一个左值,而数组名是一个右值,这里肯定有人会问:“什么?指针常量是一个左值?我没听错吧?”你的确没有听错,C89对于左值是这样定义的:

对象是一个命名的存储区域,左值(lvalue)是引用某个对象的表达式。

换言之,如果一个表达式引用的是一个具有具体存储空间的对象,它就是一个左值!那么既然指针常量是一个左值,为什么却不能给它赋值呢?是因为它受限于赋值表达式的一条规则:赋值表达式的左值不能含有限定词!

        为了防止指针指向的常量被修改,C标准对于指针间赋值有一个规定,就是左值必须包含右值的所有限定词。 这就限定了一个指向const对象的指针不能赋值给指向非const对象的指针,但反过来就允许。这个规定初看上去非常合理,但其效用其实只限于一级指针,二级指针间的赋值即使满足规定也不再安全,下面举个例子:

const int i=10;
const int **p1;
int *p2;
p1 = &p2;
*p1 = &i;
*p2 = 20;

现在你会发现,作为常量的i的值被修改了。i的值被修改的关键原因在*p1=&i;这一句,&i是一个指向常量的一级地址,如果没有二级指针p1,受限于上述规定,作为左值接受这个一级地址的指针就必须也是一个指向常量的一级指针,于是就不能进行下一步赋值20的操作。因此,正由于指向const对象的二级指针p1的出现,使得*p1也是一个指向const的指针,于是*p1=&i能够合法地运行,常量i的值被修改也就成了一个预想中的结果了。有鉴于此,某些编译器也会限定非const二级指针之间的赋值,规定上面的p1=&p2也是非法的。

        第七章介绍声明符的指针部分有一种形式:

* 类型限定符表opt 指针

这种形式产生了一种比较复杂的带const的指针,例如:

const int * const *** const ** const p;

这是一个会让人头晕目眩的表达式,声明符部分嵌套了九次,如何辨认谁是const,谁不是const呢?一旦明白了其中的原则,其实是非常简单的。第一和最后一个const大家都已经很熟悉的了。对于藏在一堆*号中的const,有一个非常简单的原则:const与左边最后一个声明说明符之间有多少个*号,那么就是多少级指针是const的。例如从右数起第二个const,它与int之间有4个*号,那么p的四级部分就是const的,下面的赋值表达式是非法的:

**p = (int *const***)10;
但下面的赋值是允许的:
***p=(int*const**)10;
从左边数起第二个const,它与int之间有1个*,那么p的一级部分是const的,也就是*****p = (int*const***const*)10;是非法的。

对于一个函数:

void func(void);

我们通常可以定义一个这样的函数指针指向它:

void (*p)(void) = func;

通过p调用func时,通常有两种写法:

p();或者(*p)();

 围绕这两种写法,当初C89制定的时候曾经有过争论。(*p)();是一种旧式的规定,旧式规定圆括号左边必须具有“函数”类型,如果是指向函数的指针,那么必须加上*声明符。但C89不再把圆括号的左边限定为“函数”类型,而是一个后缀表达式。那么问题就来了,如果p的值是函数地址,那么*号就是声明符,但如果p指向的内容是函数地址,*号就得被看作运算符了。同一种形式会有两种解释,这是一个矛盾。不仅函数调用如此,指向数组的指针也存在这种矛盾。编译器为了处理这种情况得增加代码,效率自然就降低了。争论的最后结果是谁也不能把对方完全说服,于是就干脆两种都支持了。笔者认为应该抛弃旧式的规定,p();这种形式简洁明了,又符合函数的一般形式,何乐而不为?


        第八章练习的答案,同时给出用typedef的分解方法:


int (*(*func)[5][6])[7][8];

func是一个指向数组的指针,这类数组的元素是一个具有5X6个int元素的二维数组,而这个二维数组的元素又是一个二维数组。

typedef int (*PARA)[7][8];
typedef PARA (*func)[5][6];


int (*(*(*func)(int *))[5])(int *);

func是一个函数指针,这类函数的返回值是一个指向数组的指针,所指向数组的元素也是函数指针,指向的函数具有int*形参,返回值为int。

typedef int (*PARA1)(int*);
typedef PARA1 (*PARA2)[5];
typedef PARA2 (*func)(int*);

int (*(*func[7][8][9])(int*))[5];

func是一个数组,这个数组的元素是函数指针,这类函数具有int*的形参,返回值是指向数组的指针,所指向的数组的元素是具有5个int元素的数组。

typedef int (*PARA1)[5];
typedef PARA1 (*PARA2)(int*);
typedef PARA2 func[7][8][9];
详细参照:
http://blog.csdn.net/megaboy/archive/2005/09/17/482783.aspx

posted @ 2010-02-04 18:53 菜鸟的宣言 阅读(333) 评论(0) 编辑

2009年12月21日 #

SQL SERVER 如何备份到网络服务器

如何在SQL server 2005中将数据库备份路径设为网络路径
如:“\\BackupPC\dbback\”

SQL server 2000中是可以的呀,怎么到2005就不好这样做的???
=================================
现在备份数据库真麻烦,都要先备份到本机,然后再剪切到网上邻居的另一台电脑中,真郁闷!!!!

=================================================================================

备份到异机?这是2000的做法.

写成存储过程,建立作业定时备份~~~

 

--在sql中映射一下就可以了
exec master..xp_cmdshell 'net use z:   \\yizhi\D$   "密码" /user:yizhi\administrator'

/*--说明:
exec master..xp_cmdshell 'net use z:   \\yizhi\D$  "密码" /user:xz\administrator'

z:是映射网络路径对应本机的盘符,与下面的备份对应
  \\yizhi\D$  是要映射的网络路径

xz\administrator
xz是远程的计算机名,
administrator是登陆的用户名
密码 面指定的administrator用户的密码

--*/

--备份;with init覆盖|noinit添加,这里测试直接用映射目录Z:也可以
backup database 库名 to disk='E:\H_BACKUP.bak' with init

--COPY
exec master..xp_cmdshell 'copy E:\H_BACKUP.bak z:'

--删除(这句可以去掉)
--exec master..xp_cmdshell 'del E:\H_BACKUP.bak'

--完成后删除映射
exec master..xp_cmdshell 'net use z: /delete'

 

当然在此之前还是要开通 你能够执行xp_cmdshell 存放过程的权限以及可以支持TCP/IP连接,

具体设置 在数据库 配置工具中-外围应用配置器 中 (-mssqlserver-database   engine   -远程连接,开启等)

如: sql 2005的设置

 

改一下路径和密码就行了,不一定非得用administrator用户的,也可以用别的用户。
 
另外如果提示xp_cmdshell 没有权限使用,请到sql server配置工具中-外围应用配置器-mssqlserver-database   engine   -远程连接,开启试试
 以下是sql 2005的设置界面
运行外围应用配置器后,弹出如下界面
 
点击下面的 Surface Area Configuration for Features
打上勾,然后 apply
 
 
2008的设置应该也差不多的

 

 

posted @ 2009-12-21 14:41 菜鸟的宣言 阅读(433) 评论(0) 编辑

2009年12月18日 #

SOCKET 编程介绍【转】

    该文被密码保护。

posted @ 2009-12-18 18:33 菜鸟的宣言 阅读(22) 评论(0) 编辑

2009年11月6日 #

一包酥饼的故事

有一个配有音乐的幻灯片,讲了一个故事,发人深省。现将其解说词抄录于下,与读者分享。
    一位青年的女士在候机室等候她的航班起飞。因为预计要等候很长时间,她决定买一本书来看看,以消磨时间。顺便她还买了一包酥饼。
    她坐在贵宾室的扶手椅上,放松自己,安静地阅读。在扶手椅放有酥饼的一侧,有一位先生也坐在她旁边的位置上,打开了他手上的杂志开始阅读。
    当她从袋子里拿出第一块酥饼的时候,那个男人也拿走一块。她感到恼怒,但是没有说话,而在心里想:“这人是否有点神经病!要不是我现在心情还算好,我肯定要因为他竟敢如此放肆而教训他一顿。”
    每次她拿出一块来吃,那个男的也跟着拿走一块。这简直让她火冒三丈,不过她还是忍住了,她不想让大家来看戏。到剩下最后一块酥饼的时候,她想:“好,……现在看这位不讲理的男人怎么做?”
    你猜怎么样?那男人竟然拿起那最后一块饼子,把它掰成两半,然后把其中一半递给她。啊!这简直太过分了!她现在是如此地怒不可遏!她怒冲冲地抓起她的那本书,她的手提包,然后冲进登机口。但她进入机舱找到自己的位置坐下以后,她就翻看自己的提包,想拿出眼镜。令她十分惊奇的是,她看见她买的那包酥饼还在提包里,原封未动。
    她立刻感到无地自容!!现在她明白她错了……,她忘了她的酥饼一直放在自己的提包里。是那位男人把他的酥饼分了一半给她,并没有因此有一点恼怒或者不高兴。……然而她却因此而十分恼怒,心里还认为是他把她的酥饼分给了她。
    现在已经既没有机会向他说明自己的误会……也没办法向他表示歉意。世上有四件事情是无法挽回的:扔出去的石头,说出口的话,错过的时机,还有逝去的时光!
    看了这个以后,我们会想到自己有许多时候、在许多事情上,常常错怪了别人,甚至莫明其妙地发脾气;都是因为自己不了解、不知道真实的情况,误会了别人。我们要经常省察自己的心思意念,是否只看见别人眼中有刺,而不知道自己眼中有梁木?我们常常数算别人的罪恶,批评别人的不是;对自己的缺点、过失和罪,往往文过饰非,宽容包庇。让我们虚心谦卑,宽以待人,严于责己。

posted @ 2009-11-06 11:27 菜鸟的宣言 阅读(169) 评论(0) 编辑

仅列出标题  下一页