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

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. vagrant安装的坑

    关于VAGRANT安装过程的坑 标签: 虚拟化     闲来无聊 试试vagrant虚拟化技术 安装过程中坑太多了 所以记录下方便以后 注意: 执行 vagrant up 命令报错 如下   PS F ...

  2. 如何用CMake构建Android C++库

    https://fireflytech.org/2017/11/04/compiling-cc-libraries-for-android/ https://blog.csdn.net/xhp2014 ...

  3. ios bug 分析

    ios中线上或者内部测试bug统计收集有两种方法: 1)使用第三方bug收集 1.bugHD 来源http://bughd.com/doc/ios-customize 2.bugtags 来源http ...

  4. Linux服务器关联Git,通过执行更新脚本实现代码同步

    1.在Linux服务器安装Git yum install git -y   tips: 卸载Git :  yum remove git   2.在Linux生成ssh key   1)创建用户 git ...

  5. 自定义注解-方法重试@RetryProcess

    背景 在项目开发中,有时候会出现接口调用失败,本身调用又是异步的,如果是因为一些网络问题请求超时,总想可以重试几次把任务处理掉. 一些RPC框架,比如dubbo都是有重试机制的,但是并不是每一个项目多 ...

  6. 在SQL中利用通项公式形成三角序列

    在前作 https://www.cnblogs.com/xiandedanteng/p/12735898.html中,我们可以用Java程序制成三角序列. 1, 2,2, 3,3,3, 4,4,4,4 ...

  7. MySQL通过POIN数据类型查询指定范围内数据

    情况一: 数据库:只有point类型的location字段 实体类:有经纬度字段(double).originLoction字段(存放string类型的数据库location字段:POINT(123. ...

  8. 原生JDK网络编程- NIO

    什么是NIO? NIO 库是在 JDK 1.4 中引入的.NIO 弥补了原来的 I/O 的不足,它在标准 Java 代码中提供了高速的.面向块的 I/O.NIO翻译成 no-blocking io 或 ...

  9. Spring的循环依赖,学就完事了【附源码】

    目录 啥是循环依赖? Spring可以解决循环依赖的条件 Spring如何去解决循环依赖 SpringBean的创建流程 Spring维护的三级缓存 getSingleton getSingleton ...

  10. JumpServer 架构浅解

    Jumpserver 是一款由python编写开源的跳板机(堡垒机)系统,实现了跳板机应有的功能.基于ssh协议来管理,客户端无需安装agent.完全开源,GPL授权 设计思路 设计一个跳转网关,所有 ...