部分代码跟makefile不在同一目录,有没有好的方法来设置依赖关系,我找到三种方法,但感觉都不完美,下面我会把他列出来并加以说明,不知有没有更好的方法,makefile本身也不是很熟,请大家指教;

需求如下:
1)目录结构所下所示
[src1](目录):
src11.c
src12.c
src13.c...
makefile
[src2](目录):
src21.c
src22.c
...
2)写makefie时,不想每一个文件都写上依赖关系,希望能够让其自动推导,但会列出.c的文件及路径,如下图code部分所示;
3)生成的.o与makefile不在同一目录,如./debug,如果是同一个目录,还是可以解决的,但感觉临时文件太多,不大好;

  1. OUTPUT                = ./debug
  2. SOURCES         = $(wildcard ./*.c)  $(wildcard ../src2/*.c)
  3. DIR_OBJS        = $(patsubst %.c,%.o,$(SOURCES))
  4. OBJS_NAME        = $(notdir $(patsubst %.c,%.o,$(SOURCES)))
  5. OBJS          = $(addprefix $(OUTPUT)/,$(notdir $(patsubst %.c,%.o,$(SOURCES))))
  6. LDFLAGS                +=
  7. #vpath 方式2需要
  8. vpath %.c $(addsuffix :,$(dir $(patsubst %.c,%.o,$(SOURCES)))))
  9. all: $(TARGET)
  10. $(TARGET):$(OUTPUT) $(OBJS)
  11. $(CC) $(OBJS) $(LDFLAGS) -o $(TARGET)
  12. 方法1:
  13. $(OBJS):$(SOURCES)
  14. $(CC) $(CFLAGS) -o $@ -c $(filter %$(*F).c,$(SOURCES))
  15. #该方式,有一个缺点,就是依赖于每一个src,只要一个src更改了,都会导致所有.o都需要重新依赖;
  16. # 方式2
  17. $(OBJS):$(OBJS_NAME)
  18. cp $(*F).o $(OUTPUT)/
  19. ##若此时目标(objs_name)带路径,则.c搜索无法使用指定的搜索路径
  20. $(OBJS_NAME): %.o : %.c
  21. $(CC) $(CFLAGS) -o $(OUTPUT)/$@ -c $<
  22. #该方式,如果生成的.o带上路径,则.c就无法通过vpath指定的路径搜索.c,就会直接到指定的.o所在目录搜索,如果用这种方式,那么makefile所在的.o的方式太多了..
  23. # 方式3
  24. $(OBJS):$(DIR_OBJS)
  25. #
  26. $(DIR_OBJS):%.o : %.c
  27. $(CC) $(CFLAGS) -o $@ -c  $<
  28. mv $@ ./debug/
  29. #该方式,如果src下的.o已经存在(dir_objs),那么就不会重新编译,要假设环境...

[makefile]如何设置不同目录的代码(.c),生成到指定目录下(./debug/.o))的更多相关文章

  1. OpenCV代码提取:遍历指定目录下指定文件的实现

    前言 OpenCV 3.1之前的版本,在contrib目录下有提供遍历文件的函数,用起来比较方便.但是在最新的OpenCV 3.1版本给去除掉了.为了以后使用方便,这里将OpenCV 2.4.9中相关 ...

  2. tar命令解压时如何去除目录结构及其解压到指定目录 (--strip-components N)

    去除目录结构加上 --strip-components N 如: 压缩文件eg.tar 中文件信息为 src/src/src/eg.txt 运行 tar -xvf eg.tar --strip-com ...

  3. .net 将DLL程序集生成到指定目录中

    .在程序集右键属性 .在程序集属性界面中找到生成事件 在预先生成事件命令行添加: IF NOT EXIST "$(ProjectDir)..\Bin" MD "$(Pro ...

  4. 9.JAVA之GUI编程列出指定目录内容

    代码如下: /*列出指定目录内容*/ import java.awt.Button; import java.awt.FlowLayout; import java.awt.Frame; import ...

  5. 【C#】递归搜索指定目录下的指定项目(文件或目录)

    ---------------更新:201411201121--------------- 主要更新说明:将原bool recurse参数改为int depth,这样可以指定递归深度,而不是笼统的是否 ...

  6. C#递归搜索指定目录下的文件或目录

    诚然可以使用现成的Directory类下的GetFiles.GetDirectories.GetFileSystemEntries这几个方法实现同样的功能,但请相信我不是蛋疼,原因是这几个方法在遇上[ ...

  7. TDirectory.GetFiles获取指定目录下的文件

    使用函数: System.IOUtils.TDirectory.GetFiles 所有重载: class function GetFiles(const Path: string): TStringD ...

  8. Python批量删除指定目录下的指定类型的文件

    Python作为一种脚本语言.其很适合文件级的各种操作.以下的代码能够批量删除指定目录下的所有特定类型(CSV类型)的文件. import sys, csv , operator import os ...

  9. JAVA输出指定目录下的子目录和子文件

    题目:给定一个目录,要求输出这个目录下面的子目录和子文件 逻辑: 先判断给定的是不是一个合法的目录,如果不是,则提示给定错误 如果是目录,那么使用File.listFile()获得这个目录下文件名的数 ...

随机推荐

  1. jquery 获取及设置input各种类型的值

    获取选中的值 获取一组radio被选中项的值 var item = $(“input[@name=items]:checked”).val(); 获取select被选中项的文本 var item = ...

  2. 干货 | TensorFlow的55个经典案例

    转自1024深度学习 导语:本文是TensorFlow实现流行机器学习算法的教程汇集,目标是让读者可以轻松通过清晰简明的案例深入了解 TensorFlow.这些案例适合那些想要实现一些 TensorF ...

  3. 高德地图开发之获取SHA1码

    通过Android Studio获取SHA1 第一步.打开 Android Studio 的 Terminal 工具. 第二步.输入命令:keytool -v -list -keystore  key ...

  4. 利用Axis2默认口令安全漏洞入侵WebService网站

    近期,在黑吧安全网上关注了几则利用Axis2默认口令进行渗透测试的案例,大家的渗透思路基本一致,利用的技术工具也大致相同,我在总结这几则案例的基础之上进行了技术思路的拓展.黑吧安全网Axis2默认口令 ...

  5. 图像的全局特征--LBP特征

    原文链接:http://blog.csdn.net/zouxy09/article/details/7929531#comments 这个特征或许对三维图像特征提取有很大作用.文章有修改,如有疑问,请 ...

  6. 杭电1159 Common Subsequence【最长公共子序列】

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1159 解题思路:任意先给出两个字符串 abcfbc abfcab,用dp[i][j]来记录当前最长的子 ...

  7. javascript面向对象中继承实现的几种方式

    1.原型链继承: function teacher(name){ this.name = name; } teacher.prototype.sayName = function(){ alert(t ...

  8. 算法8-----Different Ways to Add Parentheses(不同括号结果)

    题目: Given a string of numbers and operators, return all possible results from computing all the diff ...

  9. BZOJ 4712 洪水 (线段树+树剖动态维护DP)

    题目大意:略 题目传送门 数据结构好题,但据说直接上动态DP会容易处理不少,然而蒟蒻不会.一氧化碳大爷说还有一个$log$的做法,然而我只会$log^{2}$的.. 考虑静态时如何处理,设$f[x]$ ...

  10. Netty、NIO、多线程

    一:Netty.NIO.多线程? 时隔很久终于又更新了!之前一直迟迟未动也是因为积累不够,后面比较难下手.过年期间@李林锋hw发布了一个Netty5.0架构剖析和源码解读,看完也是收获不少.前面的文章 ...