<一>编译本地的源文件 + 变量的模式替换    实验代码

root@ubuntu:~/Makefile_Test/5make_test# vim makefile

  1. target := target.out
  2. CC := gcc
  3. src := $(wildcard *.c) #使用maefile的预定义函数来获取本地的后缀为C的源文件
  4. o_files := $(src:%.c=%.o) #这是(变量的高级主题之)变量的模式替换
  5.  
  6. $(o_files):$(src) #将源代码进行汇编,生成汇编文件
  7. $(CC) -c $^ -o $@
  8.  
  9. $(target) : $(o_files) #将汇编代码进行链接
  10. @echo $(o_files)
  11. @echo "--------"
  12. $(CC) $^ -o $(target)

测试:

  1. root@ubuntu:~/Makefile_Test/5make_test# ls
  2. func1.c makefile
  3. root@ubuntu:~/Makefile_Test/5make_test#
  4. root@ubuntu:~/Makefile_Test/5make_test# make target.out
  5. gcc -c func1.c -o func1.o
  6. func1.o
  7. --------
  8. gcc func1.o -o target.out

root@ubuntu:~/Makefile_Test/5make_test# make 
  make: 'func1.o' is up to date.  // 这里默认直接make第一个目标,该目标是模式替换内的变量名,应该也存在本文<三>所述问题。详见<三>。

也可以像下面这样写

  1. target := target.out
  2. CC := gcc
  3. src := $(wildcard *.c)
  4.  
  5. $(target) : $(src)
  6. $(CC) $^ -o $(target)

测试:

  1. root@ubuntu:~/Makefile_Test/5make_test#
  2. root@ubuntu:~/Makefile_Test/5make_test# cat func2.c
  3. #include <stdio.h>
  4.  
  5. int main(void)
  6. {
  7. printf("hello world \n");
  8.  
  9. return 0;
  10. }
  11. root@ubuntu:~/Makefile_Test/5make_test# ls
  12. func2.c makefile target.out
  13. root@ubuntu:~/Makefile_Test/5make_test#
  14. root@ubuntu:~/Makefile_Test/5make_test# make
  15. gcc func2.c -o target.out
  16. root@ubuntu:~/Makefile_Test/5make_test# make
  17. make: 'target.out' is up to date.

<二>变量的值的替换  实验

  1. root@ubuntu:~/Makefile_Test/5make_test#
  2. root@ubuntu:~/Makefile_Test/5make_test# cat makefile2
  3. src := a.cc b.cc c.cc
  4. obj := $(src:cc=o) #注意,这里不要有空格
  5.  
  6. test :
  7. @echo "obj => $(obj)"
  8.  
  9. root@ubuntu:~/Makefile_Test/5make_test#

root@ubuntu:~/Makefile_Test/5make_test# make -f makefile2 test
  obj => a.o b.o c.o
  root@ubuntu:~/Makefile_Test/5make_test#

<三>规则中的模式替换 实验

  1. .PHONY : all
  2. cc := gcc
  3. objs := func.o main.o
  4.  
  5. $(objs) : %.o : %.c #这里的objs是变量名,同时也作为最终make时候的目标名。实测,不可行。
  6. $(cc) -o $@ -c $^

    #规则替换,等效于下面的几句

#func.o : func.c
 # gcc -c $^ -o $@
 #main.o : main.c
 # gcc -c $^ -o $@

测试

  1. root@ubuntu:~/Makefile_Test/5make_test# make
  2. gcc -o func.o -c func.c // 死活,只能打印一句func.c相关的, 但是main.c(每次实验都已保证该文件是最新的) main.o一直不能打印出来
  3. root@ubuntu:~/Makefile_Test/5make_test#

最终的解决方法:

  1. .PHONY : all
  2. cc := gcc
  3. objs := func.o main.o
  4.  
  5. $(objs) : %.o : %.c
  6. $(cc) -o $@ -c $^

  7. #在原基础上,增加了下述代码
  8. all : $(objs) # 不把objs变量直接作为最终的目标,而是作为依赖来使用
  9. @echo "OK"

  1. #规则替换,等效于下面的几句
  1.  

#func.o : func.c
  # gcc -c $^ -o $@
  #main.o : main.c
  # gcc -c $^ -o $@

测试

  1. root@ubuntu:~/Makefile_Test/5make_test# ls
  2. func.c main.c makefile makefile2
  3. root@ubuntu:~/Makefile_Test/5make_test#
  4. root@ubuntu:~/Makefile_Test/5make_test# make all
  5. gcc -o func.o -c func.c
  6. gcc -o main.o -c main.c
  7. OK
  8. root@ubuntu:~/Makefile_Test/5make_test#
  9. root@ubuntu:~/Makefile_Test/5make_test# ls
  10. func.c func.o main.c main.o makefile makefile2

小结:不要将规则中的模式替换代码内的目标,直接作为最终make时候的目标。

makefile实验四 编译本地的源文件 + 变量的高级主题一的更多相关文章

  1. 信息安全系统设计基础实验四:外设驱动程序设计 20135211李行之&20135216刘蔚然

    北京电子科技学院(BESTI) 实 验 报 告 封面 课程:信息安全系统设计基础                                           班级:1352           ...

  2. makefile,让编译更简单

    陈皓 (CSDN) 概述—— 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的 ...

  3. Java实验四和实验五

    实验四 类的继承性和多态性 [开发语言及实现平台或实验环境] Windows2000 或XP,JDK1.6与Jcreator4.0 [实验目的] 1.  掌握OOP方式进行程序设计的方法, 2.  了 ...

  4. 《Java实验四》

    //实验4--附录一代码 public class PassValueTest { //静态代码块,类一加载就执行的部分. //所以运行这个程序会输出 class loding static { Sy ...

  5. 关于Makefile.am中与Build相关的变量设置 AM_CPPFLAGS

    http://tonybai.com/2010/10/26/about-variables-related-to-building-in-makefile-am/ 关于Makefile.am中与Bui ...

  6. 20162330 实验四 《Android程序设计》 实验报告

    2016-2017-2 实验报告目录: 1 2 3 4 5 20162330 实验四 <Android程序设计> 实验报告 课程名称:<程序设计与数据结构> 学生班级:1623 ...

  7. 实验四 CC2530平台上UART组件的TinyOS编程

    实验四 CC2530平台上UART组件的TinyOS编程 实验目的: 加深和巩固学生对于TinyOS编程方法的理解和掌握 让学生初步掌握CC2530的UART.及其TinyOS编程方法 学生通过本实验 ...

  8. 20155238 实验四 Android程序设计

    Android 安装Android Studio 按照教程依次完成安装步骤.安装所存的相应文件夹必须纯英文,不能出现特殊字符. 32位系统和64位系统是同一个安装文件.启动程序中32位与64位都有.根 ...

  9. 20155303 实验四 Android程序设计

    20155303 实验四 Android程序设计 目录 第24章:初识Android 任务一: 完成Hello World, 要求修改res目录中的内容,Hello World后要显示自己的学号 学习 ...

随机推荐

  1. go语言之文件操作

    一: 相关的API 1func Create(name string) (file *File, err Error) 根据提供的文件名创建新的文件,返回一个文件对象,默认权限是0666 2 func ...

  2. gdb我在我本机上p不了,在别人机子上可以

    gdb我在我本机上p不了,在别人机子上可以,不知道什么 (gdb) p EventFlow->devicetypeThere is no member or method named devic ...

  3. Asterisk-WebRTC客户端的部署

    很久没有写博客了.最近完成asterisk 和  jssip的库集成,浏览器支持chrome/firefox.在集成的过程中遇到了一些问题,在这儿分享出来,免得大家走弯路. 在网上看一些帖子,环境都是 ...

  4. Unity踩过的坑

    1.InvokeRepeating调用会在手机后台切换时失效,Coroutine就不会 2.DLL内的函数不支持默认参数,必须传入全部参数 不然会出现如下错误: Unhandled Exception ...

  5. 【原】“Error getting 'android:label' attribute”

    项目上线过程中遇到“Error getting 'android:label' attribute: attribute is not a string value”这个错误. 备忘下:是因为有act ...

  6. 笔记-Linux 内存优化

    1.清理前内存使用情况 free -m2.开始清理 echo 1 > /proc/sys/vm/drop_caches 3.清理后内存使用情况 free -m 4.完成! 查看内存条数命令: d ...

  7. Codeforces 1337D Xenia and Colorful Gems

    题意 给你3个数组\(a, b\)和\(c\),最小化\((x-y)^2+(y-z)^2+(z-x)^2\),其中\(x \in a, y \in b, z \in c\). 解题思路 这题其实第一眼 ...

  8. Activiti7 zip部署,查询及其删除

    zip部署 package com.itheima.activiti; import org.activiti.engine.ProcessEngine; import org.activiti.en ...

  9. 转载:把你的精力专注在java,jvm原理,spring原理,mysql锁,事务,多线程,大并发,分布式架构,微服务,以及相关的项目管理等等,这样你的核心竞争力才会越来越高

    https://developer.51cto.com/art/202001/608984.htm 把你的精力专注在java,jvm原理,spring原理,mysql锁,事务,多线程,大并发,分布式架 ...

  10. OneDrive 折腾记

    起因 百度云的一系列劝退操作 OneDrive 5T 有点香 OneDrive 介绍 OneDrive有两种, 个人版 OneDrive 和 教育企业版 OneDrive for Business 个 ...