[makefile]如何设置不同目录的代码(.c),生成到指定目录下(./debug/.o))
部分代码跟makefile不在同一目录,有没有好的方法来设置依赖关系,我找到三种方法,但感觉都不完美,下面我会把他列出来并加以说明,不知有没有更好的方法,makefile本身也不是很熟,请大家指教;
需求如下:
1)目录结构所下所示
[src1](目录):
src11.c
src12.c
src13.c...
makefile
[src2](目录):
src21.c
src22.c
...
2)写makefie时,不想每一个文件都写上依赖关系,希望能够让其自动推导,但会列出.c的文件及路径,如下图code部分所示;
3)生成的.o与makefile不在同一目录,如./debug,如果是同一个目录,还是可以解决的,但感觉临时文件太多,不大好;
- OUTPUT = ./debug
- SOURCES = $(wildcard ./*.c) $(wildcard ../src2/*.c)
- DIR_OBJS = $(patsubst %.c,%.o,$(SOURCES))
- OBJS_NAME = $(notdir $(patsubst %.c,%.o,$(SOURCES)))
- OBJS = $(addprefix $(OUTPUT)/,$(notdir $(patsubst %.c,%.o,$(SOURCES))))
- LDFLAGS +=
- #vpath 方式2需要
- vpath %.c $(addsuffix :,$(dir $(patsubst %.c,%.o,$(SOURCES)))))
- all: $(TARGET)
- $(TARGET):$(OUTPUT) $(OBJS)
- $(CC) $(OBJS) $(LDFLAGS) -o $(TARGET)
- 方法1:
- $(OBJS):$(SOURCES)
- $(CC) $(CFLAGS) -o $@ -c $(filter %$(*F).c,$(SOURCES))
- #该方式,有一个缺点,就是依赖于每一个src,只要一个src更改了,都会导致所有.o都需要重新依赖;
- # 方式2
- $(OBJS):$(OBJS_NAME)
- cp $(*F).o $(OUTPUT)/
- ##若此时目标(objs_name)带路径,则.c搜索无法使用指定的搜索路径
- $(OBJS_NAME): %.o : %.c
- $(CC) $(CFLAGS) -o $(OUTPUT)/$@ -c $<
- #该方式,如果生成的.o带上路径,则.c就无法通过vpath指定的路径搜索.c,就会直接到指定的.o所在目录搜索,如果用这种方式,那么makefile所在的.o的方式太多了..
- # 方式3
- $(OBJS):$(DIR_OBJS)
- #
- $(DIR_OBJS):%.o : %.c
- $(CC) $(CFLAGS) -o $@ -c $<
- mv $@ ./debug/
- #该方式,如果src下的.o已经存在(dir_objs),那么就不会重新编译,要假设环境...
[makefile]如何设置不同目录的代码(.c),生成到指定目录下(./debug/.o))的更多相关文章
- OpenCV代码提取:遍历指定目录下指定文件的实现
前言 OpenCV 3.1之前的版本,在contrib目录下有提供遍历文件的函数,用起来比较方便.但是在最新的OpenCV 3.1版本给去除掉了.为了以后使用方便,这里将OpenCV 2.4.9中相关 ...
- tar命令解压时如何去除目录结构及其解压到指定目录 (--strip-components N)
去除目录结构加上 --strip-components N 如: 压缩文件eg.tar 中文件信息为 src/src/src/eg.txt 运行 tar -xvf eg.tar --strip-com ...
- .net 将DLL程序集生成到指定目录中
.在程序集右键属性 .在程序集属性界面中找到生成事件 在预先生成事件命令行添加: IF NOT EXIST "$(ProjectDir)..\Bin" MD "$(Pro ...
- 9.JAVA之GUI编程列出指定目录内容
代码如下: /*列出指定目录内容*/ import java.awt.Button; import java.awt.FlowLayout; import java.awt.Frame; import ...
- 【C#】递归搜索指定目录下的指定项目(文件或目录)
---------------更新:201411201121--------------- 主要更新说明:将原bool recurse参数改为int depth,这样可以指定递归深度,而不是笼统的是否 ...
- C#递归搜索指定目录下的文件或目录
诚然可以使用现成的Directory类下的GetFiles.GetDirectories.GetFileSystemEntries这几个方法实现同样的功能,但请相信我不是蛋疼,原因是这几个方法在遇上[ ...
- TDirectory.GetFiles获取指定目录下的文件
使用函数: System.IOUtils.TDirectory.GetFiles 所有重载: class function GetFiles(const Path: string): TStringD ...
- Python批量删除指定目录下的指定类型的文件
Python作为一种脚本语言.其很适合文件级的各种操作.以下的代码能够批量删除指定目录下的所有特定类型(CSV类型)的文件. import sys, csv , operator import os ...
- JAVA输出指定目录下的子目录和子文件
题目:给定一个目录,要求输出这个目录下面的子目录和子文件 逻辑: 先判断给定的是不是一个合法的目录,如果不是,则提示给定错误 如果是目录,那么使用File.listFile()获得这个目录下文件名的数 ...
随机推荐
- jquery 获取及设置input各种类型的值
获取选中的值 获取一组radio被选中项的值 var item = $(“input[@name=items]:checked”).val(); 获取select被选中项的文本 var item = ...
- 干货 | TensorFlow的55个经典案例
转自1024深度学习 导语:本文是TensorFlow实现流行机器学习算法的教程汇集,目标是让读者可以轻松通过清晰简明的案例深入了解 TensorFlow.这些案例适合那些想要实现一些 TensorF ...
- 高德地图开发之获取SHA1码
通过Android Studio获取SHA1 第一步.打开 Android Studio 的 Terminal 工具. 第二步.输入命令:keytool -v -list -keystore key ...
- 利用Axis2默认口令安全漏洞入侵WebService网站
近期,在黑吧安全网上关注了几则利用Axis2默认口令进行渗透测试的案例,大家的渗透思路基本一致,利用的技术工具也大致相同,我在总结这几则案例的基础之上进行了技术思路的拓展.黑吧安全网Axis2默认口令 ...
- 图像的全局特征--LBP特征
原文链接:http://blog.csdn.net/zouxy09/article/details/7929531#comments 这个特征或许对三维图像特征提取有很大作用.文章有修改,如有疑问,请 ...
- 杭电1159 Common Subsequence【最长公共子序列】
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1159 解题思路:任意先给出两个字符串 abcfbc abfcab,用dp[i][j]来记录当前最长的子 ...
- javascript面向对象中继承实现的几种方式
1.原型链继承: function teacher(name){ this.name = name; } teacher.prototype.sayName = function(){ alert(t ...
- 算法8-----Different Ways to Add Parentheses(不同括号结果)
题目: Given a string of numbers and operators, return all possible results from computing all the diff ...
- BZOJ 4712 洪水 (线段树+树剖动态维护DP)
题目大意:略 题目传送门 数据结构好题,但据说直接上动态DP会容易处理不少,然而蒟蒻不会.一氧化碳大爷说还有一个$log$的做法,然而我只会$log^{2}$的.. 考虑静态时如何处理,设$f[x]$ ...
- Netty、NIO、多线程
一:Netty.NIO.多线程? 时隔很久终于又更新了!之前一直迟迟未动也是因为积累不够,后面比较难下手.过年期间@李林锋hw发布了一个Netty5.0架构剖析和源码解读,看完也是收获不少.前面的文章 ...