chap6-2-unix-make编译维护工具_第1页
chap6-2-unix-make编译维护工具_第2页
chap6-2-unix-make编译维护工具_第3页
chap6-2-unix-make编译维护工具_第4页
chap6-2-unix-make编译维护工具_第5页
已阅读5页,还剩106页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1后缀名说明.cC语言源代码文件.C/.cc/.cxxC++源代码文件.h程序所包含的头文件.i已经预处理过的C语言源代码文件.ii已经预处理过的C++源代码文件.mObjective-C语言源代码文件.s汇编语言源代码文件.S经过预编译的汇编语言源代码文件.a/.so编译后的库代码.o编译后的目标文件GNUC/C++编译器的使用gcc通过扩展名来判断文件的类型,从而确定用何种方式处理该文件2GNUC/C++编译器的使用gcc编译器选项和参数参数含义-o<file>Placetheoutputinto<file>-cCompileandassemble,butdonotlink-ggdbProducedebugginginformationforusebyGDB.-Othecompilertriestoreducecodesizeandexecutiontime,withoutperforminganyoptimizationsthattakeagreatdealofcom-pilationtime.-gProducedebugginginformationintheoperatingsystem'snativeformat.GDBcanworkwiththisdebugginginformation.-I<dir>Addthedirectorydirtothelistofdirectoriestobesearchedforheaderfiles.Directoriesnamedby-Iaresearchedbeforethe-L<dir>Searchthelibrarynamedlibrarywhenlinking3GNUC/C++编译器的使用1、直接通过编译生成目标代码可执行文件:$gcchello.c–ohello2、如果一个程序包含有多个源文件,则也可直接生成目标代码:voidf1(){printf(“%s\n”,"function1");}voidf2(){printf("%s\n","function2");}main(){f1();f2();}$gccf1.cf2.cmain.c–omain4Linux上广泛使用的C语言编译器是GNUC编译器,GNUC建立在自由软件基金会的编程许可证的基础上,可以自由发布。在Linux下,一个完整的C语言开发环境到少包括以下三个组成部分:函数库glibc(在/usr/lib和/lib目录中)编译器gcc系统头文件glibc_header(*.h)glibc是构成一个完整的C语言开发环境所必不可少的组成部分,也是Linux下C语言的主要函数库。glibc_header中包含了系统编译源代码所需要的声明文件,如果缺少系统头文件,很多用到系统功能的C程序将无法编译。(包含在/usr/include/及其子目录中)5GNUC/C++函数库定义:是一些预先编译好的函数的集合,那些函数都是按照可再使用的原则编写的。它们通常是一组相互关联的用来完成某项常见工作的函数构成(比如c库里面的标准输入输出函数、时间函数和数学函数等)。函数库中的函数可以通过连接程序与应用程序进行连接,而不必在每次开发程序时都对这些通用的函数进行编译。不同类型的应用程序将会使用不同的函数库。如数学应用将使用数学库libm(/usr/lib/libm.a,/usr/lib/libm.so),标准的C库libc(/usr/lib/libc.a,/usr/lib/libc.so)。注意:*.h只是对函数的声明(declaration),函数的定义是在具体的函数库中6所有的程序都将使用标准的C函数库libc,该库中包含了内存管理或输入输出操作的基本函数,这些库都存放在/usr/lib或/lib这些系统公用的目录中,系统中的任何用户都可以利用这些库。注:用户可以自己定义自己的函数库!库可以有三种使用的形式:静态库(*.a):代码在编译时就已连接到开发人员开发的应用程序中。静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库共享库(sharedobject,以*.so作为后缀):只是在程序开始运行时才载入,在编译时,只是简单地指定需要使用的库函数。动态库:是共享库的另一种变化形式,也是在程序运行时载入,使用的库函数不是在程序运行开始,而是在程序中的语句需要使用该函数时才载入。类似于windowsOS中的DLL文件。7共享库的生成方法动态库可以在程序运行期间释放动态库所占用的内存,腾出空间供其他程序使用。由于共享库和动态库并没有在程序中包括库函数的内容,只是包含了对库函数的引用,因此代码的规模比较小。生成用户共享库的方法:gcctest1.ctest2.ctest3.c-fPIC-shared-olibtest.so使用自定义的库进行编译、连接gcctest.c-L.libtest.so-otest8静态库的生成方法静态库的生成方法:Step1:编译而不连接$gcctest1.c-c-otest1.o$gcctest2.c-c-otest2.o$gcctest3.c-c-otest3.oStep2:生成ar命令生成静态库$arrcslibtest.atest1.otest2.otest3.oStep3:使用静态库编译和连接,生成可执行文件gcctest.c-L.libtest.a-otest9系统中可用的库都存放在/usr/lib和/lib目录中。库文件名由前缀lib和库名以及后缀组成。根据库的类型不同,后缀名也不一样。共享库名的格式:库的名称.so.主版本号.次版本号静态库名的格式:库的名称.a例如:libm.so.5 数学共享库的标识字符为m,版本号为5libm.a 静态数字库libc.a为标准C库10函数库存放的标准目录:/lib 系统必备共享库/usr/lib 标准共享库和静态库/usr/i486-linux-libc5/lib libc5兼容性函数库/usr/X11R6/lib X11R6的函数库/usr/local/lib 本地函数库11头文件存放的目录:/usr/include 系统头文件 /usr/local/include 本地头文件共享库及相关配置文件在/etc目录中,其中:ld.so.conf 包含共享库的搜索位置ldconfig 共享库管理工具,一般在更新了共享库之后要运行该命令ldd 可查看可执行文件所使用的共享库e.g.#lddtest,查看test文件的共享库依赖make工具

在开发大型软件时,往往要把整个系统划分成若干个子系统,然后再把子系统划分几个能独立工作的模块,使得软件系统模块化。这样在对系统进行编译时就要按模块进行编译。

当模块变更时,采用手工编译方法可能漏掉一些已经修改过或受影响的模块,不能保证生成的可执行文件使用最新的程序模块。当程序的各模块之间的调用关系比较复杂时,一个模块的修改往往要引起许多目标文件的重新编译与生成例如当一个程序由模块main.c,x1.c,x2.c组成时,其编译过程如下:make工具(2)$cc–cmain.c$cc–cx1.c$cc–cx2.c$cc–oprogmain.ox1.ox2.o在上例中,x1.c,x2.c或main.c中任一模块的更改都将影响程序prog的生成。

基本功能:

自动实现模块间的依赖关系,根据程序中模块的修改情况,仅重新编译修改模块及其关联模块,连接所有目标代码,以保证最终可执行文件总是由组成它的模块的最新版生成。make命令make命令是UNIX系统下开发大中型软件时,常用的一个程序自动维护工具。make命令基本操作

在说明文件(makefile)中寻找目标文件

保证该目标文件所依赖的所有文件都存在且是最新的版本

在任一程序的修改晚于该目标文件生成时间的前提下创建目标文件make命令参数make命令的常用参数:-f-i-s-r-p-e-n

指定make的说明文件忽略调用命令返回的错误代码执行时不显示所执行的命令不使用内部规则打印makefile中的宏及依赖信息不接收对shell环境变量赋值的宏定义非执行方式makefile的概念:来自文件系统的文件名和最近一次的修改日期和时间将一些间隔连接起来的内部规则makefile文件Makefile是一个描述文件,所描述的主要内容是模块间的依赖关系及在此依赖关系基础上所采取的动作。Make命令在操作时就遵循这个文件所定义的规范。make命令使用的信息源:makefile是普通的文本文件,可以使用任何一种UNIX系统下的文本编辑器创建和修改makefile文件(2)makefile必须与它使用的源文件放在同一个目录下机群系统并行程序调试环境DENNET19Makefile里有什么?Makefile里主要包含了五个东西:显式规则:要生成的文件,文件的依赖文件,生成的命令

隐晦规则:自动推导目标文件和依赖文件名的关系变量定义:运行make时,变量都会被扩展到相应的引用位置上文件指示:(1)在一个Makefile中引用另一个Makefile,与c语言中的#include一样,使用“includefoo.make”这种方式(如果是“-includefoo.make”,则表示忽略foo.make中的错误);(2)根据某些情况指定Makefile中的有效部分,就像C语言中的预编译#if一样;(3)定义一个多行的命令注释:#Makefile中的命令,必须要以[Tab]键开始

机群系统并行程序调试环境DENNET20Makefile的文件名

Makefile的一般命名规则为:常规命名顺序:GNUmakefile〉makefile〉Makefile特定名称:Makefile.linuxmake–fMake.linuxmake–fileMake.linuxMakefile最常用,一方面因为显目,另一方面符合大多数人的习惯

机群系统并行程序调试环境DENNET21make的工作方式

读入所有的Makefile;读入被include的其它Makefile;初始化文件中的变量;推导隐晦规则,并分析所有规则;为所有的目标文件创建依赖关系链;根据依赖关系,决定哪些目标要重新生成;执行生成命令。

makefile的编写(2)注释:可以在makefile的任意位置添加注释注释以#开始,以换行符结束包括行:把别的文件包括进makefile其格式为:#include“文件名”宏:定义格式为:macro-variable=value宏可以简化makefile描述文件的书写23规则的定义规则中的项目定义必须从最左边开始,一个规则中的第二行以后的行必须以tab健开始。规则的格式如下:targets:prerequisites commands或targets:prerequisites;commands commandsmakefile的编写

规则中的依赖关系:依赖关系是说明文件的关键部分,是makefile的核心部分。一个依赖关系说明一个目标依赖于哪些文件以及生成或更新该目标所需要的命令定义格式为:Target-name:[dependent…][;command][(tab)command]makefile示例#anexampleofmakefileprog:main.ox1.ox2.occ–oprogmain.ox1.ox2.omain.o:main.ccc–cmain.cx1.o:x1.ccc–cx1.cx2.o:x2.ccc–cx2.cmake将在3个源文件main.c,x1.c,x2.c中的任何一个发生变化之后执行,重新生成目标程序progmake的宏make的一个主要特性就是它可以定义和使用宏make使用的宏可以分成:

自定义的宏

预定义的宏宏可以简化makefile描述文件的书写宏常用来定义makefile中经常变化的地方,可以使对makefile的管理更加方便make的宏(2)

自定义的宏:宏既可以在make命令行中定义,也可以在makefile中定义。一旦定义了宏,就可以在makefile的任何地方使用。

宏的引用:$(macro-variable)或${macro-variable}宏的定义:macro-variable=valuemake的宏(3)make的预定义宏:$*$@$<$?$%

表示去掉后缀的当前目标名当前目标的全路径名为比给定目标文件版本更新的依赖文件名表示所有必须再编译的目标模块表示构成库的模块文件名

当目标是库文件时,目标内的成员名。例如目标x.a(y.o)的目标名为x.a,成员名为y.omake的宏(4)make的预定义宏:CCCFLAGSCPPFLAGSCOMPILE.sLINK.ccc

$(AS)$(ASFLAGS)$(CC)$(ASFLAGS)$(CPPFLAGS)-c30Makefile文件中的符号“%”%可以理解为统配符。可使用它定义或重定义模式规则。例如:%.o:%.c gcc–c$<定义了一个规则:所有目标文件*.o依赖C语言源程序*.c;且生成方法为gcc-c$<。31Makefile文件中的符号“=”或“:=”符号“=”或“:=”用于修改已经定义的变量或在已定义变量的基础上定义新变量。例如 已知:var1=a.cb.cc.c

则 var2=$(var1:.c=.o)

定义 var2=a.ob.oc.o

而 var1+=d.c

重定义var1,其值为var1=a.cb.cc.cd.c32“:=”与“=”的区别“:=”与“=”是有区别的。当使用“=”时,变量将做递归或扩展“:=”只作简单替换。厦门大学通讯工程系Makefile的Phony目标.PHONY:target不是实际的文件目标常用于clean这类并不产生实际文件的目标34Makefile中的常用目标clean:用于对项目环境进行准备,清除已经生成的目标文件等以便重新编译;install:用于对整个项目的成品进行安装;uninstall:则是用于对安装的项目进行卸载。35Makefile示例1//文件f1.c的内容f1(intarg){printf(”F1:youpassed:%d\n”,arg);}//文件f2.c的内容:f2(char*arg){printf(”F2:youpassed:%s\n”,arg);}//文件f3.c的内容#include<stdio.h>main(){fprintf(stderr,”Begine:\n”);f1(15); f2(”HelloWorld!”);fprintf(stderr,”:End\n”);exit(0);}36Makefile示例2它们之间的关系如下图37项目编译过程分析按照gcc的工作过程,对模块的编译和链接过程可分为:(1)生成目标代码

gcc-cf1.c gcc-cf2.c gcc-cf3.c(2)生成可执行程序gcc-off1.of2.of3.o38Makefile内容f:f1.of2.of3.o

gcc-off1.of2.of3.of1.o:f1.c

gcc–cf1.cf2.o:f2.c

gcc–cf2.cf3.o:f3.c

gcc–cf3.c39Makefile的使用有了Makefile文件,可以使用make命令对此项目进行编译。编译方法为:

make或makef若要编译单个项目,比方说f1.o,可以使用以下方法:

makef1.o40增加all、clean和install目标的Makefileall:f #makealltobuildff:f1.of2.of3.o gcc-off1.of2.of3.of1.o:f1.c gcc–cf1.cf2.o:f2.c gcc–cf2.cf3.o:f3.c gcc–cf3.cclean: rm–ff?.o#makeallandinstallfto/usr/binwithpermission755install:all install–m755/usr/local/binmake的宏示例2#exampleoforiginalprog:prog1.oprog2.ogccprog1.oprog2.o-oprogprog1.o:prog1.clib.hgcc-c-I.-oprog1.oprog1.cprog2.o:prog2.cgcc-cprog2.c#examplewithmacroMARCO=prog1.oprog2.oprog:$(MARCO)gccprog1.oprog2.o-o$@prog1.o:prog1.clib.hgcc-c-I.-o$@$<prog2.o:prog2.cgcc-c$*.cmake的后缀规则make的后缀规则是make隐含规则的一种在后缀规则中,目标和依赖文件名都只使用文件名后缀来代替文件名本身如:make自动认为.o为后缀的目标文件都是依赖以.c和.s为后缀的依赖文件通过后缀规则可以使用同一条规则对一系列同类别的文件进行相同的处理,极大地简化makefile的编写。

make后缀规则定义了不同后缀的文件之间的依赖关系。make的后缀规则示例当make自己定义了一个.c后缀的规则如下:.c:$(LINK.c)–o$@$<$(LDLIBS)该规则定义了从C源文件如何得到一个可执行文件。此C源文件的名称将是目的文件的名称加上.c后缀。若有一个prog.c是只使用标准C库函数的程序,其makefile为:prog:make生成目的文件时发现无此目的文件的依赖文件,就使用隐含规则“.c:”及prog.c来生成目的文件。自动化编译

Autoconf介绍内容大纲学习目的Autoconf介绍Autoconf框架图Autoconf流程Autoconf优化Autoconf小结FAQ学习目的如何方便在linux系统上写c/c++等工程的一种技巧,从而提高工程化的能力;方便的阅读理解开源代码;容易理解掌握整个工程源码的架构;写出优秀而漂亮的代码框架。Autoconf介绍无论是在Linux还是在Unix环境中,make都是一个非常重要的编译命令。可以通过查阅make的帮助文档来手工编写Makefile,当然我们更愿意自动生成Makefile。要想了解更多的自动化编译的知识,不仅仅要熟悉Makefile的语法,还要熟悉m4规则。实践还证明:光靠这些规则理论是不够的,我们要学会在实践中创造规则、完善理论。Autoconf框架图Autoconf流程-如何写configure.in在开始antoconf之前,了解一下Autoconf依赖于:Bash,Coreutils,Diffutils,Grep,M4,Make,Perl,Sed.autoscan程序可以用来为软件包创建configure.in文件。autoscan在以命令行参数中指定的目录为根(如果未给定参数,则以当前目录为根)的目录树中检查源文件。它为通常的轻便问题搜索源文件,并且为那个包创建一个configure.scan文件,这个文件就是configure.in的前身。autoscan程序是perl语言写的。将configure.scan文件重命名成configure.in或者configure.ac,并编辑之。configure.in文件中的内容都是以AC_INIT开头,以AC_OUTPUT结束。Autoconf流程-如何写configure.inconfiugre.in文件的一般布局AC_INIT测试程序测试函数库测试头文件测试类型定义测试结构测试编译器特性测试库函数测试系统调用AC_OUTPUTAutoconf流程-如何写configure.in宏含义AC_INIT(FILE)用来检查源代码所在的路径。AM_INIT_AUTOMAKE(PACKAGE,VERSION)这个宏是必须的,它描述了我们将要生成的软件包的名字及其版本号:PACKAGE是软件包的名字,VERSION是版本号。当你使用makedist命令时,它会给你生成一个类似helloworld-1.0.tar.gz的软件发行包,其中就有对应的软件包的名字和版本号。AC_PROG_CC检查系统所用的C编译器。AC_CHECK_LIB(library,function,[action-if-found],[action-if-not-found],[other-libraries])该宏用来检查lib库中是否存在指定的函数。当测试成功时,执行shell命令action_if_found或者action_if_found当为空时,在输出变量LIBS中添加-llib。action_if_not_found把-lother_libs选项传给link命令。AC_OUTPUT要输出的Makefile的名字。AC_LANG_CPLUSPLUS对C++语言的支持。AC_PROG_LIBTOOL对libtool工具的支持。AC_CHECK_HEADERS检查系统中或环境路径中是否存在指定的头文件,和AC_CHECK_LIB一样支持条件语句。AC_CHECK_FUNCS检查libraryfunctions,和AC_CHECK_LIB一样支持条件语句。Autoconf流程-如何编写m4文件m4是传统Unix的宏处理的安装启动的应用,其对应的是.m4文件记录了很多无法理解的宏。详细的介绍见官方网站:/software/m4/M4文件定义的宏一般需要在configure.in文件中调用,使用aclocal来进行解析aclocal也是一个perl脚本程序,aclocal根据configure.in文件的内容,自动生成aclocal.m4文件。.m4文件很有趣,很多gcc无法完成的工作,m4可以方便的帮助完成;特别是环境依赖、系统移植性等方面。Autoconf流程-如何编写m4文件M4文件的写法貌似shell脚本,不过更多的是宏的写法,比如定义一个宏:AC_DEFUN其他常用的宏:AC_ARG_ENABLEAC_ARG_WITHAM_CONDITIONALAC_SUBSTAS_IFAutoconf流程-autoheader负责生成config.h.in文件。该工具通常会从“acconfig.h”文件中复制用户附加的符号定义,因此此处没有附加符号定义,所以不需要创建“acconfig.h”文件。Autoconf流程-如何编写automakeautomake要用的脚本配置文件是Makefile.am,用户需要自己创建相应的文件。之后,automake工具转换成Makefile.in。automake有相对应的一些参数可以配置,比如-a等等可执行文件静态库测试文件noinst_PROGRAMS=foofoo_SOURCES=foo_LDADD=foo_LDFLAGS=foo_DEPENDENCIES=noinst_LIBRARIES=libfoo.afoo_a_SOURCES=foo_a_LDADD=foo_a_LIBADD=foo_a_LDFLAGS=check_PROGRAMS=dofoodofoo_SOURCES=dofoo_LDADD=TESTS_ENVIRONMENT=TESTS=$(check_PROGRAMS)Autoconf流程-如何编写automake目前automake支持三种目录层次:flat、shallow和deep。Flat指的是所有文件都位于同一个目录中就是所有源文件、头文件以及其他库文件都位于当前目录中,且没有子目录。Termutils就是这一类。shallow指的是主要的源代码都储存在顶层目录,其他各个部分则储存在子目录中。就是主要源文件在当前目录中,而其它一些实现各部分功能的源文件位于各自不同的目录。Automake本身就是这一类。deep指的是所有源代码都被储存在子目录中;顶层目录主要包含配置信息。就是所有源文件及自己写的头文件位于当前目录的一个子目录中,而当前目录里没有任何源文件。GNUcpio和GNUtar就是这一类。Yahoo的ydm、dcp等工程也属于这一类。flat类型是最简单的,deep类型是最复杂的。但是实际工程中我们经常用到的是deep类型的。Autoconf流程-如何编写automakeMakefile.am中尽量使用相对路径,系统预定义了两个基本路径:$(top_srcdir)工程最顶层目录,用于引用源程序;$(top_builddir)定义了生成目标文件上最上层目录,用于引用.o等编译出来的目标文件。Makefile.am中也类似于m4一样,定义了很多的宏,比如:includedir头文件的路径,等同于-I;也可以使用libfooincludedir指定特定的库引用的头文件路径;include_HEADERS定义需要安装的头文件,也可以libfooinclude_HEADERS来指定特定的库需要安装的头文件;一般和libfooincludedir结合使用;Autoconf流程-如何编写automakedata_DATA需要安装数据文件AUTOMAKE_OPTIONS由于GNU对自己发布的软件有严格的规范,比如必须附带许可证声明文件COPYING等,否则automake执行时会报错。automake提供了三种软件等级:foreign、gnu和gnits,让用户选择采用,默认等级为gnu。在本例使用foreign等级,它只检测必须的文件。bin_PROGRAMS或lib_LIBRARIES定义要产生的执行文件名。如果要产生多个执行文件,每个文件名用空格隔开。对于可执行文件和静态库类型,如果只想编译,不想安装到系统中,可以用noinst_PROGRAMS代替bin_PROGRAMS,noinst_LIBRARIES代替lib_LIBRARIES。Autoconf流程-如何编写automakeMakefile.am还可以支持pkgconfig,对于pc文件也有相应的宏的定义:pcdatadirpc文件的安装目录pcdata_DATA安装的pcdata的文件名称Autoconf流程-如何编写automakeMakefile.am还提供了一些全局变量供所有的目标体使用:INCLUDES链接时所需要的头文件LDADD链接时所需要的库文件LDFLAGS链接时所需要的库文件选项标志EXTRA_DIST源程序和一些默认的文件将自动打入.tar.gz包,其它文件若要进入.tar.gz包可以用这种办法,比如配置文件,数据文件等等。SUBDIRS在处理本目录之前要递归处理哪些子目录Autoconf流程-如何编写automakeAM_LDFLAGS同LDFLAGS一样,只是AM_LDFLAGS优先加载;AM_CPPFLAGS(AM_CFLAGS)同CPPFLAGS一样,只是AM_CPPFLAGS优先加载;AM_CXXFLAGS同CXXFLAGS一样,只是AM_CXXFLAGS优先加载;CLEANDIRS需要删除的目录MOSTLYCLEANFILES需要删除的文件Autoconf流程—autoconfautoconf是一个用于生成可以自动地配置软件源码包,用以适应多种UNIX类系统的shell脚本工具,其中autoconf需要用到m4,便于生成脚本。通过configure.in和aclocal.m4文件,使用autoconf生成configure文件,很复杂的configure文件吧!运行configure文件,生成了我们要的Makefile文件Autoconf优化-rpm方案我们知道,创建一个rpm包,需要用到一个spec文件,来注明rpm包的生成信息。在工程项目中一般通常解决方法是在文件的根目录放一个*.spec.in(用来生成spec文件)或spec文件,这里我结合了.rpmmacros采用了生成spec文件的方式:#definerpmbuildrootRPMBUILDTOPDIR=$(shellunsetRPMBUILDTOPDIR;if[-f${HOME}/.rpmmacros];thenexportRPMBUILDTOPDIR=`grep_topdir${HOME}/.rpmmacros|awk'{print$$2}'`;elseexportRPMBUILDTOPDIR=/usr/src/redhat;fi;echo$${RPMBUILDTOPDIR};)Autoconf优化-rpm方案下面的这些有点像Makefile吧,但是这个是在Makefile.am文件中:.PHONY:rpmrpm:dist@PACKAGE@.spec $(RM)${RPMBUILDTOPDIR}/SOURCES/$(distdir).tar.gz $(RM)${RPMBUILDTOPDIR}/SPECS/@PACKAGE@.spec $(LN_S)`pwd`/$(distdir).tar.gz${RPMBUILDTOPDIR}/SOURCES $(LN_S)`pwd`/@PACKAGE@.spec${RPMBUILDTOPDIR}/SPECS rpmbuild-ba${RPMBUILDTOPDIR}/SPECS/@PACKAGE@.spec这样就可以通过makerpm命令来生成rpm了,值得注意的是如果没有在.rpmmacros文件内指定_topdir,则需要sudo权限来根据系统变量来生成rpm。Autoconf小结-补充Libtool工具添加需要注意libtoolize步骤针对CFLAGS和CXXFLAGS对默认GNU的编译选项的更改针对一个lib可以拆分成两个libdata_DATA需要指定datadir变量的位置AC_HEADER_STDC等宏的合理添加makedist等各种包的打法autoreconf的使用Autoconf小结-FAQ依赖的其他项目是从代码编译的,同时他们的makefile是自己写的一套其他项目从代码进行编译的话,可以一次性把编译好的lib和头文件放到你工程下的lib和include目录下,而不是你每次修改自己工程的源文件都需要make一下其他的项目。我们的目的并不是让别人遵从我们的想法,而是宣扬我们的想法是多么的好,甚至你有更好的想法,我们会一起改进autoconf。make的时候发生的错误有时候奇奇怪怪的,比如链接起来了其他代码片段一般在make出现错误了,可以从错误代码原因进行分析,只要你遵守“游戏规则”,是不会产生链接到其它的代码片段的。这个autoconf如何和java源码一起编译我们可以写Makefile.am,方法如同写Makefile一样,把java里面的编译器,比如ant包含进来,完成我们的make过程即可。Autoconf小结-FAQ执行./configure时候出现循环等问题请重新执行aclocal;autoheader;libtoolize--force;automake-a;autoreconf一系列命令,然后./configure,如果make再出现问题,请makeclean后再次make。怎么确定不需要执行aclocal等一系列命令一般来说,修改configure.in(ac)或增加(减少)m4文件都需要进行执行aclocal等一系列命令,其他比如修改Makefile.am等不需要执行。我不会用autoconf,也不会写makefile学,除非你不想用c/c++。用的多了,经常会碰到一些问题,该找谁?Google和gnu的网站源码控制SCCS软件开发过程中,需要不断对程序进行修改和完善。这种修改和完善时常需要查阅一些早期的版本,甚至要退回到以前的某一版本重新开始。保留所开发的源程序的各个版本非常有必要,但是这样会占用大量的存储空间,而且人工管理相当困难,极易造成混乱建议你选用的版本控制系统包括:rcs,cvs,svn,git,Mercurial,Bazzar等等。UNIX系统为此提供了一个源码控制系统SCCS,它只记录对源程序的修改情况,可以对源代码的多个版本进行有效的管理和控制http://sccs.berlios.de/目前是5.06版本源码控制SCCS(2)

软件版本编号:Release.Level.Branch.Sequence发行号级别号分支号顺序号标识一组相似且兼容的版本标识同一发行版本里各文件存在的主要差异标识在特定级别上的修改标识在一个特定分支上的修改SCCS工作文件SCCS使用不同类型的文件来完成自己的工作。这些文件包含实际的源代码和SCCS执行过程中产生的信息。SCCS在原始的文件名前加上一前缀来命名这些文件。SCCS工作文件(2)s.文件:s.文件是源文件的历史文件,它包含指定源文件所有版本。它为指定文件的所有版本提供压缩存储方式,并自动维护各版本之间的关系。x.文件:由修改SCCS文件的SCCS命令创建,是SCCS文件的一个临时副本。所有修改SCCS文件的SCCS命令,实际上是对x.文件进行修改z.文件:g.文件:SCCS工作文件(3)为一个封锁文件。SCCS用它避免多个程序员同时修改一个SCCS文件用指定的s.文件的一个修改清单(delta)替代原始文件的相应部分代码,从而形成某一版本源代码的副本,该副本就是g.文件p.文件l.文件SCCS工作文件(4)为SCCS的控制文件,包含当前正在编辑的SCCS文件版本的信息。当一个g.文件从s.文件复原出来时就会产生一个相应的p.文件。它描述了复原出来的g.文件的SID、推荐版本更新后使用的SID,编辑过的g.文件和复原g.文件的用户名。存放生成给定版本所需使用的delta版本信息SCCS常用命令admingetungetdeltaprs

将源代码文件置于SCCS控制之下,创建SCCS文件检查并复原SCCS文件的某一版本的源代码取消get–e先前对一个文件的作用记录当前对源代码文件的修改变化,并创建新的版本按用户指定的格式打印SCCS文件的各部分

创建SCCS文件$admin–iprogramgram读取SCCS文件(仅能查看不能编辑)$getgramSCCS命令示例该命令为program文件创建了一个名为gram的SCCS文件,并把记录prog内容的第一个修改清单(delta)复制到gram中该命令从SCCS文件中还原出只读源文件programSCCS命令示例(2)读取SCCS文件并获取写权限$get-egram记录源代码的变化$deltagram该命令使SCCS创建了一个可读写的program文件,同时创建一个gram文件该命令执行后,将出现提示:comments?给出注释后,delta会在gram中用此信息对原版本和新版本进行比较,并把所有修改清单复制到SCCS文件中去,形成一个新的deltaGit使用简介2011/09/20Linux下的分布式版本管理系统git是一个版本控制系统。官方的解释是:版本控制(Revisioncontrol)是一种软件工程技巧,籍以在开发的过程中,确保由不同人所编辑的同一档案都得到更新。大家怎么合作开发软件呢?用信件?效率太低。用邮件,不好实现多人沟通。用googlegroup吧,可开发阶段中的源代码没法科学管理。用自建的网站吧,需要人力物力财力来支撑。GitGit是一个版本控制工具它采用了分布式版本库的方式,不必服务器端软件支持,使源代码的发布和交流极其方便。很多有名的软件都使用Git来进行版本控制,如Linux内核集中式版本管理的流程集中式版本管理的缺点:1、服务器压力太大,数据库容量暴增。2、如果不能连接到服务器上,基本上不可以工作,看上面第二步,如果服务器不能连接上,就不能提交,还原,对比等等。3、不适合开源开发(开发人数非常非常多,但是Googleappengine就是用svn的)。但是一般集中式管理的有非常明确的权限管理机制(例如分支访问限制),可以实现分层管理,从而很好的解决开发人数众多的问题。集中式版本管理的优点:1、管理方便,逻辑明确,符合一般人思维习惯。2、易于管理,集中式服务器更能保证安全性。3、代码一致性非常高。4、适合开发人数不多的项目开发。5、大部分软件配置管理的大学教材都是使用svn和vss。分布式管理的工作流程分布式管理的优缺点优点:适合分布式开发,强调个体。公共服务器压力和数据量都不会太大。速度快、灵活。任意两个开发者之间可以很容易的解决冲突。离线工作。

缺点:资料少(起码中文资料很少)。学习周期相对而言比较长。不符合常规思维。代码保密性差,一旦开发者把整个库克隆下来就可以完全公开所有代码和版本信息。Git和其他版本控制系统的主要差别直接快照,而非比较差异Git只关心文件数据的整体是否发生变化,而大多数其他系统则只关心文件内容的具体差异。这类系统(CVS,Subversion,Perforce,Bazaar等等)差别2近乎所有操作都可本地执行在Git中的绝大多数操作都只需要访问本地文件和资源,不用连网。但如果用CVCS的话,差不多所有操作都需要连接网络。因为Git在本地磁盘上就保存着所有有关当前项目的历史更新,所以处理起来速度飞快。差别3时刻保持数据完整性在保存到Git之前,所有数据都要进行内容的校验和(checksum)计算,并将此结果作为数据的唯一标识和索引。换句话说,不可能在你修改了文件或目录之后,Git一无所知。这项特性作为Git的设计哲学,建在整体架构的最底层。所以如果文件在传输时变得不完整,或者磁盘损坏导致文件数据缺失,Git都能立即察觉。差别4多数操作仅添加数据常用的Git操作大多仅仅是把数据添加到数据库。因为任何一种不可逆的操作,比如删除数据,要回退或重现都会非常困难。概念解释Gerrit——基于web的代码审核系统。Gerrit为Git引入的代码审核是强制性的,就是说除非特别的授权设置,向Git版本库的推送(Push)必须要经过Gerrit服务器,修订必须经过代码审核的一套工作流之后,才可能经批准并纳入正式代码库中三种状态对于任何一个文件,在Git内都只有三种状态:已提交(committed),已修改(modified)和已暂存(staged)。已提交表示该文件已经被安全地保存在本地数据库中了;已修改表示修改了某个文件,但还没有提交保存;已暂存表示把已修改的文件放在下次提交时要保存的清单中。git概念解释repository:一个repository就是一组代码或文本的集合master:主分支,仓库建立时自动创建HEAD:指向你项目中的当前开发branchcommit:一个commit包含一次代码的变更信息,每gitcommit一次代码,生成一个commitremote:远程仓库基本的Git工作流程1.在工作目录中修改某些文件。

2.对这些修改了的文件作快照,并保存到暂存区域。3.提交更新,将保存在暂存区域的文件快照转储到git目录中。安装Git

概括起来主要有两种,一种是通过编译源代码来安装;另一种是使用为特定平台预编译好的安装包。在Fedora上用yum安装:$yuminstallgit-coregit命令linux环境下git常用操作命令:gitinitgitclonegitlog,gitshow,gitdiffgitadd,gitcommit,gitpush,gitpullgitconfiggitbranch…gitclonegitclone:将项目仓

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论