部分代码跟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. 第八周读书笔记(人月神话X月亮与六便士)——到底什么才是一个程序员的自我修养?

    写了这么久的读书笔记,涉及到问题大多是一些如何把软件工程做好,如何把自己的职业生涯做好.但总感觉逻辑链上缺了一环,亦即:我们为什么要把软件工程做好,我们成为一名优秀的职业生涯的意义到底在于什么?我觉得 ...

  2. ML一:python的KNN算法

    (1):list的排序算法: 参考链接:http://blog.csdn.net/horin153/article/details/7076321 示例: DisListSorted = sorted ...

  3. 互联网汽车迎新成员 Alibaba YunOS Auto冠名2016世俱杯

    11月18日广州车展现场,阿里巴巴集团再次携手上汽集团连发三款搭载YunOS系统的互联网汽车,包括MG ZS.荣威eRX5和荣威i6.同时阿里巴巴集团YunOS总裁张春晖正式宣布互联网汽车业务全新升级 ...

  4. Kattis - Game Rank

    Game Rank Picture by Gonkasth on DeviantArt, cc by-nd The gaming company Sandstorm is developing an ...

  5. VMware虚拟机共享文件夹问题: /mnt下没有hgfs文件夹

    在使用vmware虚拟机共享文件夹功能的时候,发现在/mnt目录下面没有hgfs文件夹,但是vmware-tool的命令vmhgfs-fuse确实存在于系统中.在使用vmhgfs-fuse建立宿主机到 ...

  6. jQuery元素属性操作

    在jQuery中,用attr()方法来获取或者设置元素属性,removeAttr()方法用来删除元素属性. attr() 实例: var $para=$('p');//获取<p>节点 va ...

  7. JavaScript 三要素

    一个完整的JavaScript 实现由3部分组成: ECMACcript ECMAScript 规定了这门语言的下列组成部分: 语法 类型 语句 关键字.保留字 操作符 对象为什么要使用DOM?   ...

  8. vue 动态添加路由 require.context()

    之前的写法 'use strict' import Vue from 'vue' import MessageBroadcast from 'page/MessageBroadcast' import ...

  9. JavaScript 数字字符串比较大小

    JavaScript中常用数字字符串比较 1.数字与数字之间直接比较 比较方式依据数学运算,没什么好说的. 2.数字与字符串数字之间直接比较 例如 数字5 与字符串数字'123',这种比较先将数字字符 ...

  10. CodeForces-546D Soldier and Number Game 筛法+动态规划

    题目链接:https://cn.vjudge.net/problem/CodeForces-546D 题意 抱歉,我给忘了,现在看题目又看不懂: P 思路 筛法+dp 话说这个函数应该是积性函数,然后 ...