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

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

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

测试:

root@ubuntu:~/Makefile_Test/5make_test# ls
func1.c makefile
root@ubuntu:~/Makefile_Test/5make_test#
root@ubuntu:~/Makefile_Test/5make_test# make target.out
gcc -c func1.c -o func1.o
func1.o
--------
gcc func1.o -o target.out

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

也可以像下面这样写

target := target.out
CC := gcc
src := $(wildcard *.c) $(target) : $(src)
$(CC) $^ -o $(target)

测试:

root@ubuntu:~/Makefile_Test/5make_test#
root@ubuntu:~/Makefile_Test/5make_test# cat func2.c
#include <stdio.h> int main(void)
{
printf("hello world \n"); return 0;
}
root@ubuntu:~/Makefile_Test/5make_test# ls
func2.c makefile target.out
root@ubuntu:~/Makefile_Test/5make_test#
root@ubuntu:~/Makefile_Test/5make_test# make
gcc func2.c -o target.out
root@ubuntu:~/Makefile_Test/5make_test# make
make: 'target.out' is up to date.

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

root@ubuntu:~/Makefile_Test/5make_test#
root@ubuntu:~/Makefile_Test/5make_test# cat makefile2
src := a.cc b.cc c.cc
obj := $(src:cc=o) #注意,这里不要有空格 test :
@echo "obj => $(obj)" 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#

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

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

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

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

测试

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

最终的解决方法:

.PHONY : all
cc := gcc
objs := func.o main.o $(objs) : %.o : %.c
$(cc) -o $@ -c $^

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

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

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

测试

root@ubuntu:~/Makefile_Test/5make_test# ls
func.c main.c makefile makefile2
root@ubuntu:~/Makefile_Test/5make_test#
root@ubuntu:~/Makefile_Test/5make_test# make all
gcc -o func.o -c func.c
gcc -o main.o -c main.c
OK
root@ubuntu:~/Makefile_Test/5make_test#
root@ubuntu:~/Makefile_Test/5make_test# ls
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. 淘宝ios端弹窗-2020年3月25日

  2. Welcome To CUG_YZL's cnblogs

    Welcome To CUG_YZL's cnblogs  My name is YZL, studied in China University of Geosciences Wuhan now.W ...

  3. 基于postman的api自动化测试实践

    测试的好处 每个人都同意测试很重要,但并不是所有人都会去做.每当你添加新的代码,测试可以保证你的api按照预期运行.通过postman,你可以为所有api编写和运行测试脚本. postman中的测试 ...

  4. 23种设计模式 - 单一职责(Decorator - Bridge)

    其他设计模式 23种设计模式(C++) 每一种都有对应理解的相关代码示例 → Git原码 ⌨ 单一职责 在软件组件的设计中,如果责任划分的不清晰,使用继承得到的结果往往是随着需求的变化,子类急剧膨胀, ...

  5. Framework项目持续集成(jenkins)及集合SonarQube

    目录 Framework项目持续集成及集合SonarQube - 前言 CI/CD是什么 -- jenkins 什么是sonarqube?什么是CodeReview? 什么是sonarqube? 什么 ...

  6. 【Pod Terminating原因追踪系列之一】containerd中被漏掉的runc错误信息

    前一段时间发现有一些containerd集群出现了Pod卡在Terminating的问题,经过一系列的排查发现是containerd对底层异常处理的问题.最后虽然通过一个短小的PR修复了这个bug,但 ...

  7. War3模型导出

    Wiki https://en.wikipedia.org/wiki/.MDX 教程 http://www.ou99.com/article-25996-1.html http://blog.csdn ...

  8. 解锁用户scott并授权

    请输入用户名: system 输入口令: 连接到: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Producti ...

  9. 重学Ajax

    什么是Ajax Asynchronous JavaScript and xml 异步的JavaScript和XML 只是一种js的应用,在无需重新加载整个网页的情况下实现部分网页的数据更新的技术.减少 ...

  10. python格式化输出当前时间

    import time def get_now_time(): now_time = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.tim ...