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后要显示自己的学号 学习 ...
随机推荐
- 起源seo为何要做seo培训
http://www.wocaoseo.com/thread-91-1-1.html 焦大,在2010年末左右开始接触seo,2011年3月份正式开始做seo,到如今做seo已经3年了,实话说我没有其 ...
- 做seo如何选择一个好的标题
http://www.wocaoseo.com/thread-86-1-1.html 我们常说人要红妆马配鞍,那么对于seo来说,网站的标题也是很重要的,如何写好标题呢?只要注意以下几点就行了. 首先 ...
- Docker 部署 redis教程,附带部分小建议,防止踩坑
Docker 部署 redis,附带部分小建议,防止踩坑 跟所有人一样,我们先从docker基本命令开始 一.拉取redis镜像(配图来自菜鸟,其实截图没多大意义,对比看下) # 默认就拉取laste ...
- 【Android】Android开发启动app弹出一张广告图片,Dialog可以查看大图,查看某个图片功能
作者:程序员小冰,GitHub主页:https://github.com/QQ986945193 新浪微博:http://weibo.com/mcxiaobing 首先给大家看一下我们今天这个最终实现 ...
- Android开发之常用必备工具类图片bitmap转成字符串string与String字符串转换为bitmap图片格式
作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985 QQ986945193 博客园主页:http://www.cnblogs.com/mcxiaobing ...
- Codeforces1312E Array Shrinking 区间DP
题意 给你一个数组\(a\),只要满足\(a_i=a_{i+1}\)就可以将这两个元素合并成一个值为\(a_i+1\)的元素,问数组最小长度. 解题思路 记得之前某场的F和这题差不多,当时好像是相邻且 ...
- [AngstromCTF 2019]Cookie Cutter
最近看到了一个国外高中生的CTF比赛,翻了一下往年的例题,发现有一道关于jwt session伪造的题比较有意思,记录一下 题目简介中给出了我们题目的地址和后端处理的源码,看看源码先代码审计一下: c ...
- 15_Web框架-mini frame
1.WSGI协议概述(Python Web Server Gateway Interface) 1.WSGI允许开发者将选择web框架和web服务器分开,可以混合匹配web服务器和web框架,选择一个 ...
- Java获取Linux上指定文件夹下所有第一级子文件夹
说明:需要只获得第一级文件夹目录 package com.sunsheen.jfids.studio.monitor.utils; import java.io.BufferedReader; imp ...
- flag在index里
题目:http://123.206.87.240:8005/post/ 我们来看这一题 首先打开题目 他让点击就点击呗 跳转到另一个新的界面 这就没了??? ... 没思路就对了 //假装证明自 ...