makefile实验四 编译本地的源文件 + 变量的高级主题一
<一>编译本地的源文件 + 变量的模式替换 实验代码
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实验四 编译本地的源文件 + 变量的高级主题一的更多相关文章
- 信息安全系统设计基础实验四:外设驱动程序设计 20135211李行之&20135216刘蔚然
北京电子科技学院(BESTI) 实 验 报 告 封面 课程:信息安全系统设计基础 班级:1352 ...
- makefile,让编译更简单
陈皓 (CSDN) 概述—— 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的 ...
- Java实验四和实验五
实验四 类的继承性和多态性 [开发语言及实现平台或实验环境] Windows2000 或XP,JDK1.6与Jcreator4.0 [实验目的] 1. 掌握OOP方式进行程序设计的方法, 2. 了 ...
- 《Java实验四》
//实验4--附录一代码 public class PassValueTest { //静态代码块,类一加载就执行的部分. //所以运行这个程序会输出 class loding static { Sy ...
- 关于Makefile.am中与Build相关的变量设置 AM_CPPFLAGS
http://tonybai.com/2010/10/26/about-variables-related-to-building-in-makefile-am/ 关于Makefile.am中与Bui ...
- 20162330 实验四 《Android程序设计》 实验报告
2016-2017-2 实验报告目录: 1 2 3 4 5 20162330 实验四 <Android程序设计> 实验报告 课程名称:<程序设计与数据结构> 学生班级:1623 ...
- 实验四 CC2530平台上UART组件的TinyOS编程
实验四 CC2530平台上UART组件的TinyOS编程 实验目的: 加深和巩固学生对于TinyOS编程方法的理解和掌握 让学生初步掌握CC2530的UART.及其TinyOS编程方法 学生通过本实验 ...
- 20155238 实验四 Android程序设计
Android 安装Android Studio 按照教程依次完成安装步骤.安装所存的相应文件夹必须纯英文,不能出现特殊字符. 32位系统和64位系统是同一个安装文件.启动程序中32位与64位都有.根 ...
- 20155303 实验四 Android程序设计
20155303 实验四 Android程序设计 目录 第24章:初识Android 任务一: 完成Hello World, 要求修改res目录中的内容,Hello World后要显示自己的学号 学习 ...
随机推荐
- go语言之文件操作
一: 相关的API 1func Create(name string) (file *File, err Error) 根据提供的文件名创建新的文件,返回一个文件对象,默认权限是0666 2 func ...
- gdb我在我本机上p不了,在别人机子上可以
gdb我在我本机上p不了,在别人机子上可以,不知道什么 (gdb) p EventFlow->devicetypeThere is no member or method named devic ...
- Asterisk-WebRTC客户端的部署
很久没有写博客了.最近完成asterisk 和 jssip的库集成,浏览器支持chrome/firefox.在集成的过程中遇到了一些问题,在这儿分享出来,免得大家走弯路. 在网上看一些帖子,环境都是 ...
- Unity踩过的坑
1.InvokeRepeating调用会在手机后台切换时失效,Coroutine就不会 2.DLL内的函数不支持默认参数,必须传入全部参数 不然会出现如下错误: Unhandled Exception ...
- 【原】“Error getting 'android:label' attribute”
项目上线过程中遇到“Error getting 'android:label' attribute: attribute is not a string value”这个错误. 备忘下:是因为有act ...
- 笔记-Linux 内存优化
1.清理前内存使用情况 free -m2.开始清理 echo 1 > /proc/sys/vm/drop_caches 3.清理后内存使用情况 free -m 4.完成! 查看内存条数命令: d ...
- 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\). 解题思路 这题其实第一眼 ...
- Activiti7 zip部署,查询及其删除
zip部署 package com.itheima.activiti; import org.activiti.engine.ProcessEngine; import org.activiti.en ...
- 转载:把你的精力专注在java,jvm原理,spring原理,mysql锁,事务,多线程,大并发,分布式架构,微服务,以及相关的项目管理等等,这样你的核心竞争力才会越来越高
https://developer.51cto.com/art/202001/608984.htm 把你的精力专注在java,jvm原理,spring原理,mysql锁,事务,多线程,大并发,分布式架 ...
- OneDrive 折腾记
起因 百度云的一系列劝退操作 OneDrive 5T 有点香 OneDrive 介绍 OneDrive有两种, 个人版 OneDrive 和 教育企业版 OneDrive for Business 个 ...