上一篇文章写了如何为在同一个文件夹下的C源代码,本篇文章为多个文件夹下的C源代码编写Makefile文件。

  建立两个文件夹,分别为abs与src。其最终目录结构如下:

1 $ ls *
2 jun.c Makefile
3
4 abs:
5 jun.h Makefile qi.c qi.h shao.c
6
7 src:
8 Makefile qianrushi.c qianrushi.h

  首先看main函数,只能有一个main函数:

#include<stdio.h>
#include"jun.h"
#include"qi.h"
#include"../src/qianrushi.h"
int main(){
printf("shao");
jun();
qi();
qianrushi();
return 0;
}

  qi.c与qi.h:

1 //qi.c
2 #include<stdio.h>
3 void qi(){
4 printf("qi");
5 }
6
7 //qi.h
8 void qi();

  jun.c与jun.h:

1 //jun.c
2 #include<stdio.h>
3 void jun(){
4 printf("jun");
5 }
6
7 //jun.h
8 void jun();

  src下的qianrushi.c与qianrushi.h:

1 //qianrushi.c
2 #include<stdio.h>
3 void qianrushi(){
4 printf("qianrushi");
5 }
6
7 //qianrushi.h
8 void qianrushi();

  为每个文件夹建立一个Makefile文件,使得主Makefile不会太冗杂:

    abs文件夹下的Makefie:

 1 obj=shao.o  qi.o
2 CC=@gcc -c
3
4 .PHONY:all
5 all:$(obj) #要生成多个目标文件,使用伪目标作为终极目标,可以一次生成多个目标文件
6
7 shao.o:shao.c
8 $(CC) shao.c
9 cp shao.o ../
10
11 qi.o:qi.h qi.c
12 $(CC) qi.c
13 cp qi.o ../
14
15 clean:
16 rm *.o

    src文件夹下的Makefile:    

1 .PHONY:all
2 all:qianrushi.o
3
4 qianrushi.o:qianrushi.h qianrushi.c
5 gcc -c qianrushi.c
6 cp qianrushi.o ../
7
8 clean:
9 rm *.o

   主Makefile(与src和abs在同一目录下的Makefile):

 1 obj=shao.o jun.o qi.o qianrushi.o
2 cc=@gcc
3 #command=@cd ./
4
5 sum:$(obj)
6 # cd ./abs && $(MAKE)
7 # cd ./src && $(MAKE)
8 $(cc) $(obj) -o sum
9
10 shao.o:
11 @cd ./abs && $(MAKE)
12
13 jun.o:abs/jun.h jun.c
14 $(cc) -c jun.c
15
16 qi.o:
17 @cd ./abs && $(MAKE)
18
19 qianrushi.o:
20 @cd ./src && $(MAKE)
21
22 clean:
23 @rm ./*.o;
24 @rm ./src/*.o;
25 @rm ./abs/*.o;

  执行make命令就能生成可执行文件sum:

 1 $ ls
2 abs jun.c Makefile src
3 $ make
4 make[1]: Entering directory '......../abs'
5 cp shao.o ../
6 cp qi.o ../
7 make[1]: Leaving directory '......../abs'
8 make[1]: Entering directory '......../src'
9 gcc -c qianrushi.c
10 cp qianrushi.o ../
11 make[1]: Leaving directory '......../src'
12 $ ls -l
13 总用量 44
14 drwxr-xr-x 2 qi qi 4096 5月 17 20:25 abs
15 -rw-r--r-- 1 qi qi 48 5月 17 18:37 jun.c
16 -rw-r--r-- 1 qi qi 1536 5月 17 20:25 jun.o
17 -rw-r--r-- 1 qi qi 329 5月 17 18:42 Makefile
18 -rw-r--r-- 1 qi qi 1552 5月 17 20:25 qianrushi.o
19 -rw-r--r-- 1 qi qi 1536 5月 17 20:25 qi.o
20 -rw-r--r-- 1 qi qi 1736 5月 17 20:25 shao.o
21 drwxr-xr-x 2 qi qi 4096 5月 17 20:25 src
22 -rwxr-xr-x 1 qi qi 8600 5月 17 20:25 sum
23 $ make clean
24 $ ls -l
25 总用量 28
26 drwxr-xr-x 2 qi qi 4096 5月 17 20:26 abs
27 -rw-r--r-- 1 qi qi 48 5月 17 18:37 jun.c
28 -rw-r--r-- 1 qi qi 329 5月 17 18:42 Makefile
29 drwxr-xr-x 2 qi qi 4096 5月 17 20:26 src
30 -rwxr-xr-x 1 qi qi 8600 5月 17 20:25 sum

为多个文件夹下的C源代码编写Makefile文件的更多相关文章

  1. java基础 File与递归练习 使用文件过滤器筛选将指定文件夹下的小于200K的小文件获取并打印按层次打印(包括所有子文件夹的文件) 多层文件夹情况统计文件和文件夹的数量 统计已知类型的数量 未知类型的数量

    package com.swift.kuozhan; import java.io.File; import java.io.FileFilter; /*使用文件过滤器筛选将指定文件夹下的小于200K ...

  2. Java实现读取文件夹下(包括子目录)所有文件的文件名

    在编程的过程中,经常会用到对文件的读写操作等.比如,找出某一个文件夹下的所有文件名等. 下面的程序给出了,获取某一给定文件夹下所有文件的绝对路径的程序.可以作为某一个模块,在需要的时候直接使用. pa ...

  3. gitignore 忽略某文件夹下 非某后缀名的文件

    忽略指定文件夹下的除某一文件之外的其他文件 parent_dir/!spec_file_name.html 忽略指定文件夹下的除某一类后缀名的文件 parent_dir/*[!*.html] 注意:若 ...

  4. matlab遍历文件夹下所有图片和遍历所有子文件夹下图片

    做图像处理实验,经常需要遍历当前文件下所有图片.matlab当然很早就考虑了这个问题,库函数dir就是完成这个工作的.函数返回的是一个存放所有目录下文件信息的结构体,通过遍历结构体就可以达到访问所有文 ...

  5. 一个vbs文件将指定文件夹下的文件名输出到指定文件夹下

    'on error resume NextConst MY_COMPUTER=&H11& Const WINDOW_HANDLE=0 Const OPTIONS=0 '设置我的电脑为根 ...

  6. 删除文件夹下各级子目录中的.svn文件

    建立一个文本文件,取名为removeSvn.reg(扩展名由txt改为reg),内容如下 Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHIN ...

  7. Linux查找文件夹下包含某字符的所有文件

    Linux grep 命令用于查找文件里符合条件的字符串.grep 指令用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设 grep 指令会把含有范本样式的那一列显示 ...

  8. Tomcat的webapps目录下的classes文件夹下缺失编译好的.class文件原因及其解决方法

    右键,选择BuildPath: 可以编辑Output folder,指定编译后的文件的存放目录,一般是target/classes目录

  9. scala 递归读取文件夹下所有的指定后缀的文件

    def getFile(file:File): Array[File] ={ val files = file.listFiles().filter(! _.isDirectory) .filter( ...

随机推荐

  1. 创建一个Material Design应用过程

    创建一个使用Material主题的应用 1.这里需要先搭建一个应用的运行环境 创建一个AVD: 然后运行这个AVD. 2.创建应用 其中的Min SDK和Target SDK 都选择了L Preive ...

  2. vs2010中显示行号

    vs2010中显示行号 工具-->选项-->文本编辑器-->所有语言-->行号~ok

  3. Ubuntu安装特定版本安装包

    Ubuntu安装特定版本安装包可以用aptitude,aptitude是apt-get的高级版,使用起来更强大. aptitude install package=version 比如我要安装2.6. ...

  4. 1501: 货币系统(money)

    1501: 货币系统(money) 时间限制: 1 Sec  内存限制: 64 MB 提交: 33  解决: 12 [提交][状态][讨论版] 题目描述 母牛们不但创建了它们自己的政府,而且选择建立了 ...

  5. easyui datagrid加载数据的两种方式

    1.加载本地数据 var obj = {"total":2,"rows":[{id:"1",name:"一"},{id: ...

  6. SharePoint服务器端对象模型 之 使用CAML进行数据查询(Part 4)

    (五)列表查询中的阈值限制 在之前版本的SharePoint 中,如果在查询的时候没有指定返回数目,那么SharePoint将会查找该列表中所有的条目,这可能会造成在SQL表中需要返回大量的条目,极大 ...

  7. angularjs 遇见$scope,xxx=function()报错为该函数未定义

    本包子今天遇见一个问题,就是明明写了$scope,xx=function()但是报错了,报错显示是该函数未定义,我就很着急的先将函数写成一个全局函数,就没问题,等下午有空的时候寻思了一下,为什么全局就 ...

  8. Log4j将不同Package的日志输出到不同的文件

    转自:http://www.crazyant.net/1931.html 随着项目规模的越来越大,会不断的引入新的模块,不同的模块都会打印自己的日志,最后就造成日志根本没法查看,比如我自己的项目中,就 ...

  9. Vue.js之组件嵌套小demo

    Vue.js之组件嵌套的小demo项目 第一步:初始化一个wabpack项目,这里不在复述.第二步:在components文件夹下新建Header.vue Footer.vue和Users.vue三个 ...

  10. java中参数传递的问题

    public class Test { public static void main(String[] args) { StringBuffer a = new StringBuffer(" ...