当前位置: 首页 > news >正文

无锡哪里有做网站的公司品牌网站制作网站公司

无锡哪里有做网站的公司,品牌网站制作网站公司,新乡辉县网站建设,长沙h5手机网站制作转自 http://www.cnblogs.com/OpenShiFt/p/4313351.html?utm_sourcetuicoolutm_mediumreferral Makefile 文件的编写 学习前的准备 需要准备的工程目录结构如下#xff1a; . ├── add │ ├── add_float.c │ ├── add.h │ └── add_int.c ├── main… 转自 http://www.cnblogs.com/OpenShiFt/p/4313351.html?utm_sourcetuicoolutm_mediumreferral Makefile 文件的编写 学习前的准备 需要准备的工程目录结构如下 . ├── add │   ├── add_float.c │   ├── add.h │   └── add_int.c ├── main.c └── sub├── sub_float.c├── sub.h└── sub_int.c 文件编译为可执行文件cacu NOTE需要的源代码:MakefileExample.tar Makefile的介绍 使用 GCC 的命令行进行程序编译在单个文件下是比较方便的当工程中的文件逐渐增多甚至变得十分庞大的时候使用 GCC 命令编译就会变得力不从心。Linux 中的 make 工具提供了一种管理工程的功能可以方便的进行程序的编译对更新的文件进行重编译。 Makefile的基本格式为 TARGET... : DEPENDEDS...COMMAND...... TARGET:规则所定义的目标通常是最后生成的文件也可以是一个“动作”称之为“伪目标”。DEPENDEDS执行此规则所必须的依赖条件。COMMAND规则所执行的命令。命令可以是多个每个命令占一行以 Tab 开头。 动手编写多文件工程的Makefile 1.命令行编译程序 如果在命令行下手动编译该程序比较麻烦需要先编译每个文件生成目标文件最后再将5个目标文件编译成可执行文件。 #get add_int.o target gcc -c add/add_int.c -o add/add_int.o -ggdb#get add_float.o target gcc -c add/add_float.c -o add/add_float.o -ggdb#get sub_float.o target gcc -c sub/sub_float.c -o sub/sub_float.o -ggdb#get sub_int.o target gcc -c sub/sub_int.c -o sub/sub_int.o -ggdb#get main.o target gcc -c main.c -o main.o -Iadd -Isub -ggdb#get cacu bin file gcc -o cacu add/add_int.o add/add_float.o sub/sub_int.o sub/sub_float.o main.o -ggdb#get main.S target gcc -S add/add_int.o add/add_float.o sub/sub_int.o sub/sub_float.o main.o 2.多文件的Makefile 使用make进行项目管理需要编写Makefile。在编译时make程序按照顺序从Makefile文件中读取指令依次执行 #get cacu bin file cacu:add_int.o add_float.o sub_int.o sub_float.o main.ogcc -o cacu add/add_int.o add/add_float.o \sub/sub_int.o sub/sub_float.o main.o -ggdb#get add_int.o target add_int.o:add/add_int.c add/add.hgcc -c -o add/add_int.o add/add_int.c -ggdb#get add_float.o target add_float.o:add/add_float.c add/add.hgcc -c -o add/add_float.o add/add_float.c -ggdb#get sub_int.o target sub_int.o:sub/sub_int.c sub/sub.hgcc -c -o sub/sub_int.o sub/sub_int.c -ggdb#get sub_float.o target sub_float.o:sub/sub_float.c sub/sub.hgcc -c -o sub/sub_float.o sub/sub_float.c -ggdb#get main.o target main.o:main.c add/add.h sub/sub.hgcc -c -o main.o main.c -Iadd -Isub -ggdb#clean project clean:rm -f cacu add/add_int.o add/add_float.o \sub/sub_int.o sub/sub_float.o main.o 当需要编译工程时直接在工程目录中执行make即可。如果想清除编译过程中生成的目标文件和cacu执行make clean即可。 3.使用用户自定义变量的Makefile 在Makefile文件中用户可以自定义变量方便用户修改参数。 使用变量后原本冗长的文件可以化简为 CC gcc CFLAGS -Iadd -Isub -O2 OBJS add/add_int.o add/add_float.o sub/sub_float.o sub/sub_int.o main.o TARGET cacu RM rm -f$(TARGET):$(OBJS)$(CC) -o $(TARGET) $(OBJS) $(CFLAGS)$(OBJS):%o:%c$(CC) -c $(CFLAGS) $ -o $clean:$(RM) $(TARGET) $(OBJS) NOTE$(OBJS):%.o:%.c中 %.o:%.c 是将 $(OBJS) 中以 .o 结尾的文件替换成以 .c 结尾的文件。 其中 和和 是自动化变量,下一节会介绍。 4.使用预定义变量的Makefile 在Makefile中还有一些变量是系统预定义的用户可以直接使用。 Makefile中经常使用的变量及含义 变量名 含 义 默 认 值 AR 生成静态库库文件的程序名称 ar AS 汇编编译器的名称 as CC C语言编译器的名称 cc CPP C语言预编译器的名称 \$(CC) -E CXX C语言编译器的名称 g FC FORTRAN语言编译器的名称 f77 RM 删除文件程序的名称 rm -f ARFLAGS 生成静态库库文件程序的选项 无默认值 ASFLAGS 汇编语言编译器的编译选项 无默认值 CFLAGS C语言编译器的编译选项 无默认值 CPPFLAGS C语言预编译器的编译选项 无默认值 CXXFLAGS C语言编译器的编译选项 无默认值 FFLAGS FORTRAN语言编译器的编译选项 无默认值 因此前面的Makefile文件可以改写成 CFLAGS -Iadd -Isub -O2 OBJS add/add_int.o add/add_float.o \sub/sub_int.o sub/sub_float.o main.o TARGET cacu$(TARGET):$(OBJS)$(CC) -o $(TARGET) $(OBJS) $(CFLAGS)clean:-$(RM) $(TARGET) $(OBJS) 其中变量$(CC) $(RM)可以直接使用默认值分别是cc和rm -f。另外CFLAGS等变量是调用编译器时的默认选项配置在生成main.o时没有指定编译选项make程序自动调用了文件中定义的CFLAGS选项来增加头文件的搜索路径。 5.使用自动变量的Makefile 还记得上面出现的 \$ 和 \$ 吗它们是Makefile中的自动变量分别代表依赖项和目标项。下面是一些常见的自动变量及其含义 Makefile 中常见的自动变量和含义 变量 含义 * 表示目标文件的名称不包含目标文件的扩展名 表示所有的依赖文件这些依赖文件之间以空格分开按照出现的先后为顺序其中可能包含重复的依赖文件 表示依赖项中第一个依赖文件的名称 ? 依赖项中所有目标文件时间戳晚的依赖文件依赖文件之间以空格分开 目标项中目标文件的名称 ^ 依赖项中所有不重复的依赖文件这些文件之间以空格分开 由此对上面的Makefile文件进行重写代码如下 CFLAGS -Iadd -Isub -O2 OBJS add/add_int.o add/add_float.o \sub/sub_int.o sub/sub_float.o main.o TARGET cacu$(TARGET):$(OBJS)$(CC) $^ -o $ $(CFLAGS)$(OBJS):%o:%c$(CC) -c $ -o $ $(CFLAGS)clean:-$(RM) $(TARGET) $(OBJS) 6.设置搜索路径 在大的系统中通常存在很多目录手动添加目录的方法不仅十分笨拙而且容易造成错误。Make 的目录搜索功能提供了一个解决此问题的方法指定需要搜索的目录 make 会自动找到指定文件的目录并添加到文件上 VPATH 变量可以实现此目的。VPATH 变量的使用方法如下 VPATH path1:path2:... VPATH 右边是冒号:分割路径名称例如下面的指令 VPATH add:sub add_int.o:%.o:%.c$(CC) -c -o $ $ Make 的搜索路径包含 add 和 sub 目录。add_int.o 规则自动扩展成如下代码 add_int.o:add/add_int.ccc -c -o add_int.o add/add_int.c 用添加路径的方法改写上面的 Makefile 文件代码如下 CFLAGS -Iadd -Isub -O2 OBJDIR objs VPATH add:sub:. OBJS add_int.o add_float.o sub_int.o sub_float.o main.o TARGET cacu$(TARGET):$(OBJSDIR) $(OBJS)$(CC) -o $(TARGET) $(OBJDIR)/*.o $(CFLAGS)$(OBJDIR):mkdir -p ./$$(OBJS):%.o:%.c $(CC) -c $(CFLAGS) $ -o $(OBJDIR)/$clean:-$(RM) $(TARGET)-$(RM) $(OBJDIR)/*.o -r 7.自动推导规则 使用命令 make 编译扩展名为 .c 的 C 语言文件的时候源文件的编译规则不用明确地给出。这是因为 make 进行编译的时候会使用一个默认的编译规则按照默认规则完成对 .c 文件的编译生成对应的 .o 文件。它执行命令 cc -c 来编译 .c 源文件。在 Makefile 中只需要给出需要重建的目标文件一个 .o 文件make 会自动为这个 .o 文件寻找合适的依赖文件对应的 .c 文件并且使用默认的命令来构建这个目标文件。 对于上边的例子默认规则是使用命令cc -c main.c -o main.o来创建文件 main.o 。对一个目标文件是“文件名.o“依赖文件是”文件名.c“的规则可以省略其编译规则的命令行由 make 命令决定如何使用编译命令和选项。此默认规则称为 make 的隐含规则。 这样在书写 Makefile 时就可以省略掉描述 .c 文件和 .o 依赖关系的规则而只需要给出那些特定的规则描述.o 目标所需要的 .h 文件。因此上面的例子可以使用更加简单的方式书写 Makefile 文件的内容如下 CFLAGS -Iadd -Isub -O2 VPATH add:sub OBJS add_int.o add_float.o sub_int.o sub_float.o main.o TARGET cacu $(TARGET):$(OBJS)$(CC) -o $(TARGET) $(OBJS) $(CFLAGS)clean:-$(RM) $(TARGET)-$(RM) $(OBJS) 8.递归 make 对于规模比较大的程序需要多个人在多个目录下进行开发。如果只用一个 Makefile 来维护就会比较麻烦因此可以在每个目录下建立自己的 Makefile 然后在总控 Makefile 中调用子目录的 Makefile 文件。 目录结构如下 . ├── add │   ├── add_float.c │   ├── add.h │   ├── add_int.c │   └── Makefile ├── main.c ├── Makefile └── sub├── Makefile├── sub_float.c├── sub.h└── sub_int.c 1.递归调用的方式 addcd add $(MAKE) 它等价于 add$(MAKE) -C add 2.总控Makefile CC gcc CFLAGS -O2 TARGET cacu export OBJSDIR $(shell pwd)/objs$(TARGET):$(OBJSDIR) main.o$(MAKE) -C add$(MAKE) -C sub$(CC) -o $(TARGET) $(OBJSDIR)/*.o$(OBJSDIR):mkdir -p $main.o:%.o:%.c$(CC) -c $ -o $(OBJSDIR)/$ $(CFLAGS) -Iadd -Isubclean:-$(RM) $(TARGET)-$(RM) $(OBJSDIR)/*.o 如果总控 Makefile 中的一些变量需要传递给下层的 Makefile可以使用 export 命令。如export OBJSDIR ./objs 3.子目录Makefile的编写 Add 目录下的 Makefile 如下 OBJS add_int.o add_float.o all:$(OBJS)$(OBJS):%.o:%.c$(CC) -c $ -o $(OBJSDIR)/$ $(CFLAGS)clean:$(RM) $(OBJS) Sub 目录下的 Makefile 如下 OBJS sub_int.o sub_float.o all:$(OBJS)$(OBJS):%.o:%.c$(CC) -c $ -o $(OBJSDIR)/$ $(CFLAGS)clean:$(RM) $(OBJS) Makefile 中的函数 1.获取匹配模式的文件名wildcard 这个函数的功能是查找当前目录下所有符合模式 PATTERN 的文件名其返回值是以空格分割的、当前目录下的所有符合模式 PATTERN 的文件名列表。其原型如下 $(wildcard PATTERN) 例如如下模式返回当前目录下所有扩展名位 .c 的文件列表。 $(wildcard *.c) 2.模式替换函数patsubst 这个函数的功能是查找字符串 text 中按照空格分开的单词将符合模式 pattern 的字符串替换成 replacement。 Pattern 中的模式可以使用通配符 % 代表 0 个到 n 个字符当 pattern 和 replacement 中都有 % 时符合条件的字符将被 replacement 中的替换。函数的返回值是替换后的新字符串。其原型如下 $(patsubst pattern, replacement, text) 例如需要将 C 文件替换为 .o 的目标文件可以使用如下模式 $(patsubst %.c, %.o, add.c) 上面的模式将 add.c 字符串作为输入当扩展名为 .c 时符合模式 %.c ,其中 % 在这里代表 add替换为 add.o并作为输出字符串。 $(patsubst %.c, %.o, $(wildcard *.c)) 输出的字符串将当前扩展名为 .c 的文件替换成 .o 的文件列表。 3.循环函数foreach 这个函数的原型为 $(foreach VAR, LIST, TEXT) 函数的功能为 foreach 将 LIST 字符串中一个空格分割的单词先传给临时变量 VAR 然后执行 TEXT 表达式 TEXT 表达式处理结束后输出。其返回值是空格分割表达式 TEXT 的计算结果。 例如对于存在 add 和 sub 的两个目录设置 DIRS 为 add sub ./ 包含目录 add、sub 和当前目录。表达式 $(wildcard $(dir)/*.c) ,可以取出目录 add 和 sub 及当前目录中的所有扩展名为 .c 的C语言源文件 DIRS sub add ./ FILES $(foreach dir, $(DIRS), $(wildcard $(dir)/*.c)) 利用上面几个函数对原有的 Makefile 文件进行重新编写使新的 Makefile 可以自动更新各个目录下的C语言源文件 CC gcc CFLAGS -O2 -Iadd -Isub TARGET cacu DIRS sub add . FILES $(foreach dir, $(DIRS), $(wildcard $(dir)/*.c)) OBJS $(patsubst %.c, %.o, $(FILES)) $(TARGET):$(OBJS)$(CC) -o $(TARGET) $(OBJS)clean:-$(RM) $(TARGET)-$(RM) $(OBJS) 总结 至此已经可以阅读大部分软件的 Makefile 了
http://www.yutouwan.com/news/382585/

相关文章:

  • 济宁 网站建设公司装修费属于什么费用
  • 网站网站制作网站的百度收录网站怎么做
  • 深圳龙岗做网站的沙漠风网站建设
  • 查询网站收录情况的方法医院网站建设报告
  • 用ps做网站页面的大小手机建站免费
  • 零基础建网站深圳平台网站开发
  • 石家庄网站外包wordpress博客模板缺少插件
  • 公司网站建设苏州劳伦开发公司临检管理办法
  • 吃的网站要怎么做的做公司网站的模板
  • dw创建网站相册怎么进入公司网站
  • 网站是先备案还是先做网站wordpress中文图片插件
  • 建设银行公积金查询网站首页平面设计免费自学网
  • 旅游类网站设计方案南京高端模板建站
  • 网站做哪种推广好网站社区的建设
  • 用来做区位分析的地图网站网站怎么做才吸引人
  • 移动互联网开发天气预报实现效果报告湖北seo服务
  • 网站内容规划广东省建设厅投诉网站首页
  • 郑州网站建设炉石自己的网站没有域名解析
  • 虚拟商品自动发货网站搭建教程深圳金科威公司官网
  • 福州建网站,做网页wordpress文件锁定了
  • 怎么做好网站建设秀网站模板
  • 南京网站建设网站设计云南建设工程招标网站
  • dw自己做网站需要什么区别网络推广的概念
  • 电子商务网站规划与建设论文做美食推广的网站
  • 培训网站app网站建设济宁
  • 制作网站的专业公司网页设计外包价格
  • 大型网站开发什么书籍好自己搭建的网站可以收费吗
  • 个人网站设计开题报告邯郸最新消息
  • php一个企业网站多钱酒店网站搜索引擎优化方案
  • 织梦网站模板安装教程优质公司网站