⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 00000009.htm

📁 一份很好的linux入门资料
💻 HTM
📖 第 1 页 / 共 5 页
字号:
生成所有警告信息。&nbsp;<BR>&nbsp;<BR>gcc&nbsp;的其他例子,可参阅&nbsp;info&nbsp;帮助或&nbsp;gcc&nbsp;手册页。作为例子,请看如下的&nbsp;gcc&nbsp;命&nbsp;<BR>令:&nbsp;<BR>$&nbsp;gcc&nbsp;-o&nbsp;test&nbsp;-D_DEBUG&nbsp;-g&nbsp;-I../include/&nbsp;-L../lib&nbsp;-lmylib&nbsp;test.c&nbsp;<BR>上面的命令编译连接并生成可执行文件&nbsp;test。-D选项定义了一个&nbsp;_DEBUG&nbsp;宏,-g指定生&nbsp;<BR>成调试信息,-I和&nbsp;-L&nbsp;分别指定了一个额外的头文件路径和一个额外的函数库路径,-l&nbsp;<BR>指定了一个连接时的搜索函数库。&nbsp;<BR>13.3.3&nbsp;&nbsp;GNU&nbsp;的&nbsp;make&nbsp;工具&nbsp;<BR>在大型的开发项目中,通常有几十到上百个的源文件,如果每次均手工键入&nbsp;gcc&nbsp;命&nbsp;<BR>令进行编译的话,则会非常不方便。因此,人们通常利用&nbsp;make&nbsp;工具来自动完成编译工作。&nbsp;<BR>这些工作包括:如果仅修改了某几个源文件,则只重新编译这几个源文件;如果某个头文&nbsp;<BR>件被修改了,则重新编译所有包含该头文件的源文件。利用这种自动编译可大大简化开发&nbsp;<BR>工作,避免不必要的重新编译。&nbsp;<BR>实际上,make&nbsp;工具通过一个称为&nbsp;makefile&nbsp;的文件来完成并自动维护编译工作。&nbsp;<BR>makefile&nbsp;需要按照某种语法进行编写,其中说明了如何编译各个源文件并连接生成可执&nbsp;<BR>行文件,并定义了源文件之间的依赖关系。当修改了其中某个源文件时,如果其他源文件&nbsp;<BR>依赖于该文件,则也要重新编译所有依赖该文件的源文件。makefile&nbsp;文件是许多编译器,&nbsp;<BR>包括&nbsp;Windows&nbsp;NT&nbsp;下的编译器维护编译信息的常用方法,只是在集成开发环境中,用户通&nbsp;<BR>过友好的界面修改&nbsp;makefile&nbsp;文件而已。&nbsp;<BR>默认情况下,GNU&nbsp;make&nbsp;工具在当前工作目录中按如下顺序搜索&nbsp;makefile:&nbsp;<BR>?&nbsp;GNUmakefile&nbsp;<BR>?&nbsp;makefile&nbsp;<BR>?&nbsp;Makefile&nbsp;<BR>在&nbsp;UNIX&nbsp;系统中,习惯使用&nbsp;Makefile&nbsp;作为&nbsp;makfile&nbsp;文件。如果要使用其他文件作&nbsp;<BR>为&nbsp;makefile,则可利用类似下面的&nbsp;make&nbsp;命令选项指定&nbsp;makefile&nbsp;文件:&nbsp;<BR>$&nbsp;make&nbsp;-f&nbsp;Makefile.debug&nbsp;<BR>13.3.3.1&nbsp;&nbsp;makefile&nbsp;的内容&nbsp;<BR>makefile&nbsp;中一般包含如下内容:&nbsp;<BR>?&nbsp;需要由&nbsp;make&nbsp;工具创建的项目,通常是目标文件和可执行文件。通常使用“目&nbsp;<BR>标(target)”一词来表示要创建的项目。&nbsp;<BR>?&nbsp;要创建的项目依赖于哪些文件。&nbsp;<BR>?&nbsp;创建每个项目时需要运行的命令。&nbsp;<BR>例如,假设你现在有一个&nbsp;C++&nbsp;源文件&nbsp;test.C,该源文件包含有自定义的头文件&nbsp;&nbsp;<BR>test.h,则目标文件&nbsp;test.o&nbsp;明确依赖于两个源文件:test.C&nbsp;和&nbsp;test.h。另外,你可能&nbsp;<BR>只希望利用&nbsp;g++&nbsp;命令来生成&nbsp;test.o&nbsp;目标文件。这时,就可以利用如下的&nbsp;makefile&nbsp;来&nbsp;<BR>定义&nbsp;test.o&nbsp;的创建规则:&nbsp;<BR>#&nbsp;This&nbsp;makefile&nbsp;just&nbsp;is&nbsp;a&nbsp;example.&nbsp;<BR>#&nbsp;The&nbsp;following&nbsp;lines&nbsp;indicate&nbsp;how&nbsp;test.o&nbsp;depends&nbsp;<BR>#&nbsp;test.C&nbsp;and&nbsp;test.h,&nbsp;and&nbsp;how&nbsp;to&nbsp;create&nbsp;test.o&nbsp;<BR>&nbsp;<BR>test.o:&nbsp;test.C&nbsp;test.h&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;g++&nbsp;-c&nbsp;-g&nbsp;test.C&nbsp;<BR>从上面的例子注意到,第一个字符为&nbsp;#&nbsp;的行为注释行。第一个非注释行指定&nbsp;test.o&nbsp;为&nbsp;<BR>目标,并且依赖于&nbsp;test.C&nbsp;和&nbsp;test.h&nbsp;文件。随后的行指定了如何从目标所依赖的文件建&nbsp;<BR>立目标。&nbsp;<BR>当&nbsp;test.C&nbsp;或&nbsp;test.h&nbsp;文件在编译之后又被修改,则&nbsp;make&nbsp;工具可自动重新编译&nbsp;&nbsp;<BR>test.o,如果在前后两次编译之间,test.C&nbsp;和&nbsp;test.h&nbsp;均没有被修改,而且&nbsp;test.o&nbsp;还&nbsp;<BR>存在的话,就没有必要重新编译。这种依赖关系在多源文件的程序编译中尤其重要。通过&nbsp;<BR>这种依赖关系的定义,make&nbsp;工具可避免许多不必要的编译工作。当然,利用&nbsp;Shell&nbsp;脚本&nbsp;<BR>也可以达到自动编译的效果,但是,Shell&nbsp;脚本将全部编译任何源文件,包括哪些不必要&nbsp;<BR>重新编译的源文件,而&nbsp;make&nbsp;工具则可根据目标上一次编译的时间和目标所依赖的源文件&nbsp;<BR>的更新时间而自动判断应当编译哪个源文件。&nbsp;<BR>一个&nbsp;makefile&nbsp;文件中可定义多个目标,利用&nbsp;make&nbsp;target&nbsp;命令可指定要编译的目&nbsp;<BR>标,如果不指定目标,则使用第一个目标。通常,makefile&nbsp;中定义有&nbsp;clean&nbsp;目标,可用&nbsp;<BR>来清除编译过程中的中间文件,例如:&nbsp;<BR>clean:&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;rm&nbsp;-f&nbsp;*.o&nbsp;<BR>运行&nbsp;make&nbsp;clean&nbsp;时,将执行&nbsp;rm&nbsp;-f&nbsp;*.o&nbsp;命令,最终删除所有编译过程中产生的所有中&nbsp;<BR>间文件。&nbsp;<BR>13.3.3.2&nbsp;&nbsp;makefile&nbsp;中的变量(宏)&nbsp;<BR>GNU&nbsp;的&nbsp;make&nbsp;工具除提供有建立目标的基本功能之外,还有许多便于表达依赖性关系&nbsp;<BR>以及建立目标的命令的特色。其中之一就是变量或宏的定义能力。如果你要以相同的编译&nbsp;<BR>选项同时编译十几个&nbsp;C&nbsp;源文件,而为每个目标的编译指定冗长的编译选项的话,将是非&nbsp;<BR>常乏味的。但利用简单的变量定义,可避免这种乏味的工作:&nbsp;<BR>#&nbsp;Define&nbsp;macros&nbsp;for&nbsp;name&nbsp;of&nbsp;compiler&nbsp;<BR>CC&nbsp;=&nbsp;gcc&nbsp;<BR>&nbsp;<BR>#&nbsp;Define&nbsp;a&nbsp;macr&nbsp;o&nbsp;for&nbsp;the&nbsp;CC&nbsp;flags&nbsp;<BR>CCFLAGS&nbsp;=&nbsp;-D_DEBUG&nbsp;-g&nbsp;-m486&nbsp;<BR>&nbsp;<BR>#&nbsp;A&nbsp;rule&nbsp;for&nbsp;building&nbsp;a&nbsp;object&nbsp;file&nbsp;<BR>test.o:&nbsp;test.c&nbsp;test.h&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;$(CC)&nbsp;-c&nbsp;$(CCFLAGS)&nbsp;test.c&nbsp;<BR>在上面的例子中,CC&nbsp;和&nbsp;CCFLAGS&nbsp;就是&nbsp;make&nbsp;的变量。GNU&nbsp;make&nbsp;通常称之为变量,&nbsp;<BR>而其他&nbsp;UNIX&nbsp;的&nbsp;make&nbsp;工具称之为宏,实际是同一个东西。在&nbsp;makefile&nbsp;中引用变量的值&nbsp;<BR>时,只需变量名之前添加&nbsp;$&nbsp;符号,如上面的&nbsp;$(CC)&nbsp;和&nbsp;$(CCFLAGS)。&nbsp;<BR>GNU&nbsp;make&nbsp;有许多预定义的变量,这些变量具有特殊的含义,可在规则中使用。表&nbsp;13-2&nbsp;&nbsp;<BR>给出了一些主要的预定义变量,除这些变量外,GNU&nbsp;make&nbsp;还将所有的环境变量作为自己&nbsp;<BR>的预定义变量。&nbsp;<BR>表&nbsp;13-2&nbsp;&nbsp;GNU&nbsp;make&nbsp;的主要预定义变量&nbsp;<BR>预定义变量&nbsp;<BR>含义&nbsp;<BR>$*&nbsp;<BR>不包含扩展名的目标文件名称。&nbsp;<BR>$+&nbsp;<BR>所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件。&nbsp;<BR>$&lt;&nbsp;<BR>第一个依赖文件的名称。&nbsp;<BR>$?&nbsp;<BR>所有的依赖文件,以空格分开,这些依赖文件的修改日期比目标的创建日期晚。&nbsp;<BR>$@&nbsp;<BR>目标的完整名称。&nbsp;<BR>$^&nbsp;<BR>所有的依赖文件,以空格分开,不包含重复的依赖文件。&nbsp;<BR>$%&nbsp;<BR>如果目标是归档成员,则该变量表示目标的归档成员名称。例如,如果目标名称为&nbsp;&nbsp;<BR>mytarget.so(image.o),则&nbsp;$@&nbsp;为&nbsp;mytarget.so,而&nbsp;$%&nbsp;为&nbsp;image.o。&nbsp;<BR>AR&nbsp;<BR>归档维护程序的名称,默认值为&nbsp;ar。&nbsp;<BR>ARFLAGS&nbsp;<BR>归档维护程序的选项。&nbsp;<BR>AS&nbsp;<BR>汇编程序的名称,默认值为&nbsp;as。&nbsp;<BR>ASFLAGS&nbsp;<BR>汇编程序的选项。&nbsp;<BR>CC&nbsp;<BR>C&nbsp;编译器的名称,默认值为&nbsp;cc。&nbsp;<BR>CFLAGS&nbsp;<BR>C&nbsp;编译器的选项。&nbsp;<BR>CPP&nbsp;<BR>C&nbsp;预编译器的名称,默认值为&nbsp;$(CC)&nbsp;-E。&nbsp;<BR>CPPFLAGS&nbsp;<BR>C&nbsp;预编译的选项。&nbsp;<BR>CXX&nbsp;<BR>C++&nbsp;编译器的名称,默认值为&nbsp;g++。&nbsp;<BR>CXXFLAGS&nbsp;<BR>C++&nbsp;编译器的选项。&nbsp;<BR>FC&nbsp;<BR>FORTRAN&nbsp;编译器的名称,默认值为&nbsp;f77。&nbsp;<BR>FFLAGS&nbsp;<BR>FORTRAN&nbsp;编译器的选项。&nbsp;<BR>&nbsp;<BR>13.3.3.3&nbsp;&nbsp;隐含规则&nbsp;<BR>GNU&nbsp;make&nbsp;包含有一些内置的或隐含的规则,这些规则定义了如何从不同的依赖文件&nbsp;<BR>建立特定类型的目标。GNU&nbsp;make&nbsp;支持两种类型的隐含规则:&nbsp;<BR>?&nbsp;后缀规则(Suffix&nbsp;Rule)。后缀规则是定义隐含规则的老风格方法。后缀规则&nbsp;<BR>定义了将一个具有某个后缀的文件(例如,.c&nbsp;文件)转换为具有另外一种后缀&nbsp;<BR>的文件(例如,.o&nbsp;文件)的方法。每个后缀规则以两个成对出现的后缀名定义,&nbsp;<BR>例如,将&nbsp;.c&nbsp;文件转换为&nbsp;.o&nbsp;文件的后缀规则可定义为:&nbsp;<BR>.c.o:&nbsp;<BR>$(CC)&nbsp;$(CFLAGS)&nbsp;$(CPPFLAGS)&nbsp;-c&nbsp;-o&nbsp;$@&nbsp;$&lt;&nbsp;<BR>?&nbsp;模式规则(pattern&nbsp;rules)。这种规则更加通用,因为可以利用模式规则定义&nbsp;<BR>更加复杂的依赖性规则。模式规则看起来非常类似于正则规则,但在目标名称&nbsp;<BR>的前面多了一个&nbsp;%&nbsp;号,同时可用来定义目标和依赖文件之间的关系,例如下面&nbsp;<BR>的模式规则定义了如何将任意一个&nbsp;X.c&nbsp;文件转换为&nbsp;X.o&nbsp;文件:&nbsp;<BR>%.c:%.o&nbsp;<BR>$(CC)&nbsp;$(CFLAGS)&nbsp;$(CPPFLAGS)&nbsp;-c&nbsp;-o&nbsp;$@&nbsp;$&lt;&nbsp;<BR>13.3.3.4&nbsp;&nbsp;makefile&nbsp;实例&nbsp;<BR>下面给出一个&nbsp;makefile&nbsp;的实例,见清单&nbsp;13-3。&nbsp;<BR>清单&nbsp;13-3&nbsp;&nbsp;一个&nbsp;makfile&nbsp;文件的例子&nbsp;<BR>―――――――――――――――――――――――――――――――――――――――&nbsp;<BR>#----------------------------------------------------------------------&nbsp;<BR>#&nbsp;Makefile&nbsp;for&nbsp;test&nbsp;programs&nbsp;of&nbsp;MiniGUI4&nbsp;for&nbsp;Linux.&nbsp;<BR>#&nbsp;Copyright&nbsp;(c)&nbsp;1999,&nbsp;Wei&nbsp;Yongming.&nbsp;<BR>#&nbsp;<BR>#----------------------------------------------------------------------&nbsp;<BR>&nbsp;<BR>#&nbsp;These&nbsp;may&nbsp;be&nbsp;changed,&nbsp;if&nbsp;desired&nbsp;<BR>CC=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gcc&nbsp;<BR>CCOPTS=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-O2&nbsp;-Wall&nbsp;-m486&nbsp;-D_REENTRANT&nbsp;<BR>&nbsp;<BR>#&nbsp;-------------------------------------------------------------------&nbsp;#&nbsp;<BR>&nbsp;<BR>CFLAGS=&nbsp;$(CCOPTS)&nbsp;<BR>TESTPROG=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;testgui&nbsp;<BR>TESTOBJ&nbsp;=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;testgui.o&nbsp;misc.o&nbsp;gdi.o&nbsp;cursor.o&nbsp;event.o&nbsp;desktop.o&nbsp;\&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;window.o&nbsp;main.o&nbsp;cliprect.o&nbsp;menu.o&nbsp;fixstr.o&nbsp;timer.o&nbsp;dti.o&nbsp;<BR>&nbsp;<BR>all:&nbsp;&nbsp;&nbsp;&nbsp;$(TESTPROG)&nbsp;<BR>&nbsp;<BR>$(TESTPROG):&nbsp;&nbsp;&nbsp;&nbsp;$(TESTOBJ)&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$(CC)&nbsp;-o&nbsp;$(TESTPROG)&nbsp;$(TESTOBJ)&nbsp;-lvgagl&nbsp;-lvga&nbsp;-lpthread&nbsp;<BR>&nbsp;<BR>clean:&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rm&nbsp;-f&nbsp;*.o&nbsp;*~&nbsp;.*.swp&nbsp;.*.swo&nbsp;<BR>&nbsp;<BR>testgui.o:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;window.h&nbsp;event.h&nbsp;misc.h&nbsp;gdi.h&nbsp;cursor.h&nbsp;main.h&nbsp;common.h&nbsp;<BR>cliprect.o:&nbsp;&nbsp;&nbsp;&nbsp;cliprect.h&nbsp;common.h&nbsp;<BR>misc.o:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;misc.h&nbsp;gdi.h&nbsp;cliprect.h&nbsp;common.h&nbsp;<BR>gdi.o:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gdi.h&nbsp;cliprect.h&nbsp;misc.h&nbsp;common.h&nbsp;<BR>cursor.o:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cursor.h&nbsp;gdi.h&nbsp;cliprect.h&nbsp;misc.h&nbsp;common.h&nbsp;<BR>event.o:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;event.h&nbsp;cursor.h&nbsp;misc.h&nbsp;common.h&nbsp;<BR>desktop.o:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;menu.h&nbsp;fixstr.h&nbsp;cliprect.h&nbsp;window.h&nbsp;event.h&nbsp;cursor.h&nbsp;\&nbsp;<BR>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -