VxWorks操作系统MakeFile

合集下载

vxWorks开发环境构建步骤及开发资源

vxWorks开发环境构建步骤及开发资源

vxWorks开发环境构建步骤及开发资源技创科技(Technique Innovator Inc.) 一、Tornado集成开发环境构成Tornado是集成开发环境的名称,主要由帮助及参考文档、操作系统vxWorks、开发工具(编译器、调试器、编辑器、target server等,据统计,挂接在Tornado下的可选工具和第三方有数百个)等三部分构成,分别对应三个目录:i.docs/ 所有文档都集中在该目录中, books.html是根索引,入门级开发请务必查看以下文档:●如果要熟悉使用界面及Tornado使用、创建工程,请参考:Tornado用户手册及Tornado集成开发环境的HELP->content调出来的联机帮助文档;●vxWorks的编译是使用标准GNU Makefile来编译连接的,要了解Makefile语法请参考”GNU Make”;具体的Make rules存放在target/h/make/目录下。

●如何调试?请参考“Debugging with GDB”●vxWorks构成、特点及kernel,编程等:请参考:VxWorks Programmer's Guide,系统调用、库函数接口标准等,请参考:VxWorks Reference Manual●有关BSP(board support package)的构成、初始化、底层驱动等,请参考“BSPReference”●网络应用编程指南(socket编程): “VxWorks Network Programmer's Guide”ii.host/ 该部分存放主机端(开发机)的工具,如Tornado.exe,make.exe,编译器、调试器及TCL命令解释器等等,开发中要用到的工具都存放在目录host\x86-win32\bin 下,部分命令是.exe文件,部分是.bat的,其中有torvars.bat文件,是设置Tornado集成开发环境的环境变量用的,在使用其他工具前,要运行它设置正确的环境变量及可执行文件搜索路径。

VxWork介绍及编程

VxWork介绍及编程

VxWork介绍及编程一.嵌入式操作系统VxWorks简介VxWorks操作系统是美国WindRiver公司于1983年设计开发的一种嵌入式实时操作系统(RTOS),是嵌入式开发环境的关键组成部分。

良好的持续发展能力、高性能的内核以及友好的用户开发环境,在嵌入式实时操作系统领域占据一席之地。

它以其良好的可靠性和卓越的实时性被广泛地应用在通信、军事、航空、航天等高精尖技术及实时性要求极高的领域中,如卫星通讯、军事演习、弹道制导、飞机导航等。

在美国的 F-16、FA-18 战斗机、B-2 隐形轰炸机和爱国者导弹上,甚至连1997年4月在火星表面登陆的火星探测器上也使用到了VxWorks。

WindRiver公司网址实时操作系统和分时操作系统的区别从操作系统能否满足实时性要求来区分,可把操作系统分成分时操作系统和实时操作系统。

分时操作系统按照相等的时间片调度进程轮流运行,分时操作系统由调度程序自动计算进程的优先级,而不是由用户控制进程的优先级。

这样的系统无法实时响应外部异步事件。

实时操作系统能够在限定的时间内执行完所规定的功能,并能在限定的时间内对外部的异步事件作出响应。

分时系统主要应用于科学计算和一般实时性要求不高的场合。

实时性系统主要应用于过程控制、数据采集、通信、多媒体信息处理等对时间敏感的场合。

VxWorks的特点∙可靠性操作系统的用户希望在一个工作稳定,可以信赖的环境中工作,所以操作系统的可靠性是用户首先要考虑的问题。

而稳定、可靠一直是VxWorks的一个突出优点。

自从对中国的销售解禁以来,VxWorks以其良好的可靠性在中国赢得了越来越多的用户。

∙实时性实时性是指能够在限定时间内执行完规定的功能并对外部的异步事件作出响应的能力。

实时性的强弱是以完成规定功能和作出响应时间的长短来衡量的。

VxWorks 的实时性做得非常好,其系统本身的开销很小,进程调度、进程间通信、中断处理等系统公用程序精练而有效,它们造成的延迟很短。

VxWorks操作系统简介

VxWorks操作系统简介

VxWorks操作系统简介VxWorks操作系统简介VxWorks操作系统是一种广泛应用于嵌入式系统开发的实时操作系统。

本文将详细介绍VxWorks操作系统的架构、特性、应用领域以及相关的法律名词注释。

一、VxWorks操作系统架构VxWorks操作系统采用分层架构,包括内核层、中间层以及外围应用层。

具体架构如下:⒈内核层:提供底层的操作系统服务,包括任务管理、内存管理、中断处理、设备驱动等。

内核层使用高度模块化的设计,可以根据需求选择性地加载不同的内核服务。

⒉中间层:提供更高层次的功能,如文件系统、网络协议栈、图形用户界面等。

中间层通过对内核接口的封装,提供更便捷的应用开发接口。

⒊外围应用层:包括用户应用程序和系统管理工具。

用户应用程序可以基于VxWorks操作系统的开发环境进行开发,并且通过内核和中间层提供的接口与系统进行交互。

二、VxWorks操作系统特性VxWorks操作系统有以下特点:⒈实时性:VxWorks操作系统被广泛应用于实时系统开发,具有快速响应、低延迟和可预测性等特性。

它使用了优化的调度算法和中断处理机制,确保系统对实时任务的及时响应。

⒉可靠性:VxWorks操作系统采用了可靠性设计和故障恢复机制,例如内存保护、任务隔离和异常处理等。

这些机制可最大限度地减少系统崩溃和错误的影响。

⒊可扩展性:VxWorks操作系统具有高度可扩展性,可以根据应用的需要进行灵活配置。

开发人员可以根据系统需求选择性地加载所需的内核服务和中间层模块,以达到最佳性能和资源利用。

⒋安全性:VxWorks操作系统提供了多层次的安全机制,包括权限控制、数据加密和访问控制等。

这些机制可以在网络和物理环境中保护系统不受未经授权的访问和攻击。

三、VxWorks操作系统的应用领域VxWorks操作系统在各行各业都有广泛的应用,特别适用于对实时性和可靠性要求较高的领域。

以下是一些典型的应用领域:⒈工业自动化:VxWorks操作系统被广泛用于控制系统和工业领域,如汽车制造、航空航天和机械制造等。

Vxworks虚拟机环境搭建

Vxworks虚拟机环境搭建

Vxworks虚拟机环境搭建一、tornado的安装大部分地方默认,部分要注意的地方如下:需要的安装包:[风河VxWorks].WINDRIVER.TORNADO.V2.2.FOR.PENTIUM.CD1.ISO[风河VxWorks].WINDRIVER.TORNADO.V2.2.FOR.PENTIUM.CD2.ISO 虚拟光驱工具:任意DTLite4356-0091.zip (必须通过虚拟光驱来安装)注册序列号:sn_all.txt 见第四条四、WINDRIVER.TORNADO.V2.2.FOR.PENTIUM软件大小:328M安装方法:1)首先安装虚拟光驱软件DAEMON3.22)分别MOUNT 文件夹CD1和CD2下后缀名为BIN的文件3)自动安装后,输入序列号如下:CD1: cAQ8i-qP2I&-g$vT6-3&gjw-bEk9gCD2: A7KbB-Rd37p-hNFBE-kzgaT-b9gpC4)拷贝CRACK目录下的license.dat 到c:\flexlm 目录,如果没有这个目录,自己建一个。

设置如下环境变量:LM_LICENSE_FILE = c:\flexlm\license.dat按装完tornado后,首先要解压vxworks_end.exe文件三次出现target文件夹,将target\h\drv\end\ln97xEnd.h和target\src\drv\end\ln97xEnd.c、Makefile 覆盖对应的问件。

不要全部覆盖。

(其他的config\pc486.972、man文件夹都不要,太旧了。

注意做好整个tornado2.2\target的备份)二安装vxworks:总的过程分为以下几步:1、编译网卡驱动单击windows系统的开始菜单,在“运行”里输入“cmd”打开控制台程序。

进入:D:\tornado2.2\host\x86-win32\bin\运行:torVars.bat;进入:cd D:\tornado2.2\target\src\drv\end目录运行:make CPU=PENTIUM tool=gnu ln97xend.o (这一步会出现重复提示,不要管它,它自己会结束。

嵌入式系统原理与应用习题答案

嵌入式系统原理与应用习题答案

版权说明本文件中出现的任何文字叙述、文件格式、插图、照片、方法、过程等内容,除另有特别注明,版权均属本人所有。

----WangYiwei由于我正在学习“嵌入式系统原理与应用——基于ARM微处理器和Linux操作系统”这门课程,网络上找不到课后习题答案。

因此本人通过认真地做习题,不懂百度,查阅相关书籍等途径,整理了一份答案,可供各位参考。

注意:答案并不一定完全正确,有异议的答案欢迎提出来大家一起探讨。

练习题P141.选择题(1)A说明:嵌入式系统的发展趋势表现在以下几方面:1.产品种类不断丰富,应用范围不断普及2.产品性能不断提高3.产品功耗不断降低,体积不断缩小4.网络化、智能化程度不断提高5.软件成为影响价格的主要因素(2)D说明:常见的嵌入式操作系统: VxWorks,Windows CE、uC/OS-II和嵌入式Linux。

(3)A说明:VxWorks是美国WindRiver公司于1983年开发的一种32位嵌入式实时操作系统。

2.填空题(1)嵌入式计算机(2)微处理器外围电路外部设备(3)板级支持包实时操作系统应用编程接口应用程序(4)嵌入式处理器微控制器数字信号处理器3.简答题(1)简述嵌入式系统的定义和特点答:定义:以应用为中心,以计算机技术为基础,软硬件可裁剪,应用系统对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统。

特点:专用性强、实时性好、可裁剪性好、可靠性高和功耗低等。

(2)简述计算机系统的发展历程第一阶段大致在20世纪70年代前后,可以看成是嵌入式系统的萌芽阶段;第二阶段是以嵌入式微处理器为基础,以简单操作系统为核心的嵌入式系统;第三阶段是以嵌入式操作系统为标志的嵌入式系统,也是嵌入式应用开始普及的阶段;第四阶段是以基于Internet为标志的嵌入式系统,这是一个正在迅速发展的阶段。

(3)简述MCU和DSP的区别MCU是微控制器,DSP是数字信号处理器。

MCU相当于小型的电脑,内部集成的CPU、ROM、RAM、I/O总线,所以集成度高是它的特点。

vmware下vxworks6.6安装文档

vmware下vxworks6.6安装文档

vmware下vxworks6.6安装⽂档VmWare下跑VxWorks 6.6 教程1、先期准备a)开发环境VxWorks 6.6 for pentium 安装包VmWare WorkStation 7.1.2b)⼯具虚拟软驱RamDiskNT 1.52、虚拟机设置2.1安装虚拟软驱(供虚拟硬盘做DOS,和初期拷贝⽂件使⽤)保证红圈配置正确后,点击START运⾏,随后重启电脑,虚拟软驱A应该就出现了2.2 新建虚拟机File->New->Virtual Machine->Custom->New-Workstation 5->other(other)->指定虚拟机名和保存位置->选单处理器->内存128MB对应VxWorks⾜以->使⽤桥接⽹络(注意:⼀定要使⽤⽹桥连接)->IO适配器选BusLogic->创建虚拟硬盘->类型选择IDE(Recommended) ->磁盘空间设置0.25GB(256MB)⾜以,并勾上⽴刻分配磁盘空间->最终完成虚拟机配置3、FTP引导的bootrom制作修改BSP⾸先,我们复制⼀份纯净未做修改的D:\WindRiver-GPPVE-3.6-IA-Eval\vxworks-6.6\target\config\下的pcPentium3⽂件夹,改名为Pentium3(名称随便你起),再将该改名后⽂件夹放到config⽬录下,最好不要带空格或什么特殊符号。

我们要修改编译bootrom、VxWorks的配置头⽂件Config.h中定义的⼀些参数,使编译出来的系统引导程序bootrom和VxWorks 的映象符合我们的要求;3.1修改config.h1)定位到⽬录D:\WindRiver-GPPVE-3.6-IA-Eval\vxworks-6.6\target\config\Pentium3并打开该⽬录下Config.h⽂件;2)定位到”INCLUDE_CPU_PROBE”,更改成如下:3)查找到定义DEFAULT_BOOT_LINE宏的地⽅,修改预处理条件CPU = = PENTIUM3分⽀下的定义如下:"lnPci(0,0)host: vxWorks h=172.18.101.121 e=172.18.101.124:ffffff00 u=target pw=target tn=target"这⾥的host地址得修改成你的主机地址,target地址只需要在同⼀个⽹段内就可以了4)定位到INCLUDE_ATA,在前⾯⼀句添加#undef INCLUDE_FD,如下所⽰:5)定位到/* Network driver options: VxBus drivers */作如下修改:6)定位到INCLUDE_LN_97X_END,将其定义上,修改如下:7)定位到INCLUDE_PC_CONSOLE,将其设成定义的,如下所⽰8)定位到#if (SYS_WARM_TYPE == SYS_WARM_BIOS),修改如下:3.2修改 configNet.h1)定位到/* max number of END ipAttachments we can have */ 在上⾯添加如下内容:/* Am79C97x (lnPci) driver defines */#ifdef INCLUDE_LN_97X_END#define LN_97X_LOAD_FUNC sysLn97xEndLoad#define LN_97X_BUFF_LOAN TRUE#define LN_97X_LOAD_STR ""IMPORT END_OBJ * LN_97X_LOAD_FUNC (char *, void *);#endif /* INCLUDE_LN_97X_END */截图如下:2)定位到/* Atheros AR521X WLAN Support */在上⾯添加如下内容:#ifdef INCLUDE_LN_97X_END{0, LN_97X_LOAD_FUNC, LN_97X_LOAD_STR, LN_97X_BUFF_LOAN,NULL, FALSE},#endif /* INCLUDE_LN_97X_END */截图如下:3.3 将D:\WindRiver-GPPVE-3.6-IA-Eval\vxworks-6.6\target\src\drv\end⽬录下的ln97xEnd.c拷贝进你的Pentium3⽬录下,并作如下修改:定位到 do {; /* poll for suspend mode entry */}while ((csrLockedRead (pDrvCtrl, CSR(5)) & CSR5_SPND) == 0);添加宏如下所⽰:3.4将5.5的Sysln97xEnd.c移植到你的Pentium3⽬录下,并作如下修改:1)定位到/* map a 4Kb 32-bit non-prefetchable memory address decoder */ 添加如下宏2)定位到ln97xPciResources[ln97XUnits].bar[0] = ioBase;添加如下宏:3.5修改makefile⽂件,作如下修改:1)定位到TOOL = diab将diab修改为gnu2) 定位到EXTRA_DEFINE,作如下修改:3.6修改sysnet.c1)定位到# include "sysUltraEnd.c"添加内容如下:2)定位到LOCAL VEND_ID_DESC vendorIdEnet [] = 修改内容如下:3.7 将安装⽬录下的wrenv.exe拷贝进Pentium3⽬录下,删除如下⽂件:bootrom;bin;bootrom.pxe;vxWorks;vxWorks.st;vxWorks.sym并添加两个⽂件如下:1)torVars.bat内容如下:wrenv -p vxworks-6.62)vxcopy.bat内容如下:objcopypentium -O binary --gap-fill=0 %1 %23.8 编译BootRom往PATH环境变量添加路径,如下所⽰D:\WindRiver-GPPVE-3.6-IA-Eval\vxworks-6.6\host\x86-win32\bin;D:\WindRiver-GPPVE-3.6-IA-Eval\workbench-3.0\x86-win32\bin打开Wind River Workbench 3.0,File->New ->VxWorks BootLloader / BSP Project,填写⼯程名,并选择我们的Pentium3⽂件夹,及⼯具gnu,然后编译:打开CMD,进去⽬录Pentium3⽂件夹,运⾏如下命令mkboot a: bootrom 注意:之间的空格,不然会出错3.9基于BSP创建VxWorks镜像打开Wind River Workbench 3.0,File->New->VxWorks Image Project,还是选择Pentium跟⼯具gnu,然后配置组件FTP Server组件,编译⼯程⽂件3.5开始配置FTP Server1)打开FTP Server->Security -> users/rights -> New User -> ⽤户名跟密码都是vxworks –>在Home Directory 填写你编译好的vxworks image所放置路径,然后选择Done 3.6关闭防⽕墙,设置Vmware从软盘启动,最后运⾏VmWare,然后就能够加载成功了。

嵌入式实时操作系统VxWorks下BSP分析及VxWorks裁减

嵌入式实时操作系统VxWorks下BSP分析及VxWorks裁减

第15卷 第2期2005年6月天 津 工 程 师 范 学 院 学 报JO URNAL O F T I ANJ I N UN I VERS I TY O F TECHNOLO GY AND ED UCAT I O N Vol .15 No .2Jun .2005嵌入式实时操作系统Vx W orks 下BSP 分析及Vx W orks 裁减3褚 哲,孟小锁(西安微电子技术研究所,陕西西安710075)摘 要:以Vx Works 操作系统为例,阐述了BSP 的概念、原理和系统启动流程,并在此基础上以某目标机为原型,着重叙述了Vx Works 的裁减方法。

关键词:Vx Works;板级支持包;映像中图分类号:TP316.2 文献标识码:A 文章编号:167321018(2005)022*******BSP ana lysis under em bedded rea l 2ti m e opera ti n gsystem Vx W orks and Vx W orks ′t a ilorCHU Zhe,ME NG Xiao 2suo(Xi ′an M icr oelectr onics Technol ogy I nstitute,Xi ′an 710054,China )Abstract :This article takes the Vx Works operating system as an examp le to illustrate the concep t,the p rincirle and the start 2up p r ocedure of BSP .Under this foundation it uses certain target machine as original for m to ex 2p lain the tail or method of Vx Works .Key words :Vx Works;board suppot package;i mage Vx Works 操作系统是美国W indR iver 公司推出的一种嵌入式强实时操作系统,自20世纪80年代问世以来,以其不断推出的升级版本、高性能内核以及友好的用户开发环境,在嵌入式实时操作系统领域逐渐占据一席之地,尤其以成功应用于火星探测车和爱国者导弹等高科技产品而声名鹊起,拥有较多的用户。

Makefile经典教程(最掌握这部分足够---因为汇集全部精华)!!!!!!!!!!

Makefile经典教程(最掌握这部分足够---因为汇集全部精华)!!!!!!!!!!

Makefile经典教程0 Makefile概述什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makefile还是要懂。

这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解HTML的标识的含义。

特别在Unix下的软件编译,你就不能不自己写makefile了,会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。

因为,makefile关系到了整个工程的编译规则。

一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。

makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。

make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。

可见,makefile都成为了一种在工程方面的编译方法。

现在讲述如何写makefile的文章比较少,这是我想写这篇文章的原因。

当然,不同产商的make各不相同,也有不同的语法,但其本质都是在“文件依赖性”上做文章,这里,我仅对GNU的make进行讲述,我的环境是RedHat Linux 8.0,make的版本是3.80。

必竟,这个make是应用最为广泛的,也是用得最多的。

而且其还是最遵循于IEEE 1003.2-1992 标准的(POSIX.2)。

在这篇文档中,将以C/C++的源码作为我们基础,所以必然涉及一些关于C/C++的编译的知识,相关于这方面的内容,还请各位查看相关的编译器的文档。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

VxWorks操作系统MakeFile(一)时间:2008-8-24 夜版权申明:本文为水煮鱼为水煮鱼@博客园撰写,不得用于商业用途,如需摘用,请与水煮鱼联系。

1、介绍本文将介绍为什么要将你的C源代码分离成几个合理的独立文档,什么时候需要拆分,那又怎么拆分呢?然后再介绍如何使用GUN Make使你的编译和链接步骤自动化。

可能你使用的是其他的make工具,但是其实道理都差不多。

当然如果你对自己的编程工具有怀疑的话,可以不妨实际的试试。

2、多文件项目介绍a. why?为什么使用多文件项目?他们有什么好处呢?从表面上看,多文件项目是够复杂的了,又要头文件,又需要extern申明,并且如果你要查找一个文件的话,还需要在更多的文件里搜索。

但是如果把其考虑成一个项目,那一个项目根据功能划分为小的模块,那就不难理解了。

想想如果是一个一万行代码,如果你把其放到一个文件里,则在编译的时候,则需要对一万行代码进行重新编译。

不过如果你如果把其放到不同的文件里,那修改一行,则只需要编译一个文件就可以了。

可能你会说,一万行代码,就算全部编译,那点时间也基本可以忽略不计,但是实际情况是,在一个大的系统里,可能代码达到几十万甚至上百万,千万行代码的规模。

以我们的项目为例,目前代码规模已经达到了上千万行的级别,如果全部重新编译,则将耗费几个小时甚至半天的时间。

如果将其划分多多个文件,则修改一行所引入的编译代码,将不会随着你代码规模的增大而增大。

所以多个文件的优点不言自明了。

不过对于不便于搜索的问题,其实只要文件划分得当,也并不会造成多大的困难。

其实,从多个目标文件生成一个程序包比从一个单一文件生成程序包要好的多。

当然,实际上这是不是一个优势还与你所使用的系统有关。

但是当使用gcc/ld(一个GUN C编译器/连接器)把一个程序包连接到一个程序时,在连接的过程中,它会尝试不去连接没有使用到的部分,但它每次只能从程序包中把一个完整的目标文件排除在外。

因此,如果你修改了一个程序包中某一个目标文档中任何一个符号的话,那么这个目标文件整个都会被连接进来。

要是一个程序包被非常充分的分解的话,那么经过链接后,得到的可执行文件会比从一个大目标文件组成的程序包连接得到的文件小的多。

并且常常我们的程序是模块化的,高内聚,低耦合,使得文件之间共享部分被减少到了最少,因此采用多文件的方式,可以比较容易的找到代码中的bug。

b.when?那什么时候分解你的项目?如果你开发的是一个大项目,在开始前,应该好好考虑一下你将如何实现,并且将生成几个文件来存放你的代码。

当然,在项目的开发过程中,你可以建立新的我文件,但是这将打乱你的整体布局,可能造成你整体结构的调整。

因此特别建议在做之前,需要想想细细的考虑清楚,开发过程中允许有小范围的调节,但是涉及到整体结构的修改,将为你的项目引入过多的风险。

如果你开发的是一个中型的项目,你可以向上面介绍的那样,想清楚了再开始动手,但是你也可以想当然的写到哪就到哪,当你发现你的代码已经多到难以管理的时候在进行分解,但是希望你尽量先有一个好的谋局后,再动手,你将花费的代码最小。

c.how?如何分解呢?一下仅仅是个人的建议,如果你有自己的风格的话,如果你认为更好,那请保持你原来的做法:i. 不用使用一个header指向多个源代码。

使用一个头文件对应一个源代码文件,不仅更容易查询,方便代码的阅读,而且,无需修改一个头文件,而引起更多的文件的重新编译。

ii.如果可以的话,推荐采用多个头文件指向一个源代码文件的方式。

有时将不可公开调用的函数原型,类型定义等,从它们的C源嗲吗文件中分离出来是非常有用的。

可以使用一个库文件装共用的变量,而使用另外一个库文件装私用的变量,这样不会导致你修改源代码文件的内部结构时,你只需要重新编译这个源代码文件,而无需重新编译调用了公开的库文件的其他源代码。

iii.不要再多个库文件中重复定义。

这个不说,大家应该都知道为什么了。

iv. 在每一个源代码文件中,#include那些申明了源代码符号的所有头文件。

这样一来,你在源文件和头文件对某些函数做出的矛盾声明就可以比较容易的被编译器发现。

编译中常见的一些错误:1、定义符在源码文件中的矛盾。

在C语言里,变量和函数的缺省状态是公用的。

因此任何C源码的文件都可以引用存在于其他源码文件中的全局函数和全局变量,即使在这个源码文件中,并没有该全局函数或者全局变量的声明或者原型。

因此你必须保证在你的全局函数或者全局变量没有重复的定义,否则在连接的时候会出现错误,可能在编译的时候也会提示告警。

解决方法:一种有效的解决方法,就是在你申明的全局函数或者全局变量名前,加入一个可以区分文件的前缀名:比如如果在gfx.c里的函数完全就可以加上前缀名gfx_。

如果要防止一个符号在它被定义的源文件以外看到,可以在它的定义前加上关键字“static", 则该关键字定义了该符号的局部属性,仅能在定义的文件内使用。

(请注意,改关键字”static“的使用与局部变量定义时的区别)。

2、多次定义的符号。

当你用#include包含一个库文件的时候,实际上在编译的时候仅仅是在该处使用你包含的库文件逐字替换。

如果头文件被#include到多个文档中时,该头文件中的所有定义都会在你引用的源代码中重新定义一次。

重复定义,会导致链接出现错误。

解决方法:不要在头文件中定义变量。

定义变量一般放到使用他们的源码问文件中,而在其他文件中声明一下就可以了。

对于初学者来说,定义和声明,总是容易混淆。

定义的时候,编译器会给该变量分配实际的内存空间,而声明,仅仅是通知编译器该变量存在,并且告知该变量的类型。

声明一个变量的时候,需要在它的前面加上extern的关键字。

由于函数的原型中已经有了隐式的extern,所以不要考虑该问题。

3、重复定义、重复声明或者类型矛盾考虑如果你的源码文件中#include了头文件a.h和b.h,但是你的头文件中a.h又包含了b.h,则编译的时候会出现什么结果呢?很明显,b.h中定义的宏或者声明都会被执行两次。

从理论上讲,这样的重复都是完全一样的拷贝,不会出现问题,但是在实际的编译中,这是不符合C的基本语法,可鞥编译的时候会出现错误,至少也是一个告警。

解决办法:确定每一个头文件中在任何一个源码文件中仅仅包含了一次。

但是随着代码规模的扩大,通过认为控制的手段实在有点低效。

聪明的方法是使用预处理器。

常用的用法是:#ifndef MACRO_XXXX#define MACRO_XXXX XXXX#endif但是如果每一个宏都这么放一条,是不是显得也太低效了呢?(还不说,我还真的看到了这么做的,呵呵!!)在实际的应用中,我们只需在头文件的开头处定义:#ifndef FILENAME_H#define FILENAME_H在库文件的最后处定义:#endif使用库文件的文档名代替上面的FILENAME就可以了Makefile的结构:一般编译的步骤为:1、将每一个单独的源代码文件首先编译成为目标文件。

2、通过链接器,将目标文件连接成为可执行文件。

由于本文只讨论vxworks中的makefile,因此本文主要以常用的gcc为例。

通过-c开关,可以使用gcc将源文件编译成为期望的目标文件。

生成文件以.o为后缀名。

然后通过命令gcc -o exec_filename *.o,将生成的目标文件连接成为可执行文件。

在gcc中,生成的可执行文件以.out为后缀名。

对于一个多文件的项目,这些非常繁琐。

但是GNU Make工具让一切都可以变得很简单。

GUN Make的输入是一个文本文件:makefile。

在这个文件中,主要描述了目的文件是从那些依靠文件中产生的关联关系。

根据文本中描述的关系,make通过检查磁盘上的文件,如果目的文件的时间戳比至少它一个依靠文件的时间戳旧的话,make工具将执行相应的命令,以更新目的文件。

一个makefile主要含有以下的规则::....(tab)<command>(tab)<command>...例:====make file 开始====myprog:foo.o bar.ogcc foo.o bar.o -o myprogfoo.o: foo.c foo.h bar.hgcc -c foo.c -o foo.obar.o: bar.c bar.hgcc -c bar.c -o bar.o====make file 结束====这是一个非常典型的makefile。

make从最上面开始,把上面第一个目的, "myprog",作为它的主要目标。

给出跪着说明只要文件"myprog"比文件"foo.o"或者"bar.o"中的任何一个旧,则下一行命令将会被执行。

但是在检查文件foo.o和bar.o的文件戳之前,它会往下查找那些把foo.o或者bar.o 作为目标文件的规则,以此递归,直到找到最新的目标文件,并执行该目标文件下的命令。

从此可以看出,make工具通过这种递归查找最新时间戳的方式,保证当你修改任何代码的时候(可能是只有修改了一个源码文件,或者一个头文件),保证与之关联的文件都可以被编译。

当然,你必须保证你在makefile中写的编译规则,都是正确的,只列出了那些在源码文件中被包括的头文件。

编写Make的规则:通过上节的介绍,知道了怎么去生成一个makefile文件。

当文件较少的时候,采用上述的方法是可行的。

但是随着文件数目的增加,已经各个文件相互依赖关系变复杂以后,以上生成makefile的方式已经不再具有可行性了。

幸好很多编译器都具有自动生成makefile的功能。

以gcc为例:打开-m开关,则gcc 可以将你输入的C文件,根据其中包含的头文件自动生成依赖文件。

注意,如果采用-mm的方式,采用“<”,“>”方式包含的头文件将不生成依赖文件。

通过gcc生成的makefile,不会包含命令部分,该部分你可以自己补充,或者直接使用它的隐藏规则。

为了便于编写makefile文件,下面将具体介绍生成的makefile文件中的一些基本概念:1、makefile变量makefile变量类似于环境变量,起对大小写敏感,一般使用大写字母表示,它可以在任何地方引用,主要具有如下的功能:a. 用于存储文件列表名。

生成可执行文件的makefile,需要指定一些目标文件作为依赖文件;或者在命令行部分,需要会执行那些文件作为gcc命令的输入文件,通过变量的方式来存储这些文件名,更便于makefile的维护;b.用于存储可执行文件名。

如果你使用的是一个非gcc的编译器,则可能你需要修改所有命令行的使用的gcc的编译名部分,你可以定义一个变量保存编译器名称,则当编译器不同时,简单的修改该变量名称从而实现对不同编译器的命令的整体替代修改。

相关文档
最新文档