实例一

1、分析源文件代码依赖关系

mian.c

#include "test1.h"
#include "test2.h"
#include <stdio.h>
int main()
{
test1_func("hello test1!");
test2_func("hello test2!");
return ;
}

这里可以看出 main.o 文件的生成需要 main.c , test1.h , test2.h

test1.h

#ifndef _TEST_1_H
#define _TEST_1_H
void test1_func(char *str);
#endif

test1.h 里面有 test1.c 里面函数的声明

test2.h

fndef _TEST_2_H
#define _TEST_2_H
void test2_func(char *str);
#endif

test2.h 里面有 test2.c 里面函数的声明

test1.c

#include "test1.h"
#include <stdio.h> void test1_func(char *str)
{
printf("This is test1 : %s ",str);
}

生成 test1.o 文件,需要 test1.c , test1.h

test2.c

#include "test2.h"
#include <stdio.h> void test2_func(char *str)
{
printf("This is test2 : %s",str);
}

生成 test2.o 文件,需要 test2.c , test2.h

2、直接编写Makefile文件

[root@localhost MakefileExample]# vim Makefile
#Makefile
main:main.o test1.o test2.o
gcc -o main main.o test1.o test2.o
main.o:main.c test1.h test2.h
gcc -c main.c
test1.o:test1.c test1.h
gcc -c test1.c
test2.o:test2.c test2.h
gcc -c test2.c
.PHONY:clean
clean:
rm -f *.o main

make 编译

清除生成的 .o 文件

3、运用变量编写Makefile文件

#Makefile
OBJ=main.o test1.o test2.o
CC =gcc
test:$(OBJ)
$(CC) -o $@ $^
main.o:main.c test1.h test2.h
$(CC) -c $<
test1.o:test1.c test1.h
$(CC) -c $<
test2.o:test2.c test2.h
$(CC) -c $<
.PHONY:clean
clean:
rm -f $(OBJ) test

make编译

实例二

1、分析源文件代码依赖关系

hello.c

void showhello()  {
hello();
}

生成 hello.o 文件需要依赖 hello.c , hello.h

hello.h

/*hello.h*/
#ifndef HELLO_H
#define HELLO_H void hello() {
star1();
printf("hello,my friends\n");
} #endif

hello.h 里面有 star() 函数的函数体

star.c

#include "starfun.h"
#include "hello.h"
#include <stdio.h>
int main() {
star1();
star2();
showhello();
return ;
}

生成 star.o 文件,需要依赖 star.c , hello.h , starfun.h 文件

starfun.h

/*****starfun.h*****/
#ifndef STARFUN_H
#define STARFUN_H #define NUM 4
#define NUMBER 3 int star1() {
int i,j,k;
for(k=;k<=NUM;++k) {
for(i=;i<=(NUM-k);++i)
printf(" ");
for(j=;j<=(*k-);++j)
printf("*");
printf("\n");
}
return ;
}
int star2() {
int i,j,k;
for(k=NUMBER;k>=;--k) {
for(i=;i<=(NUMBER-k+);++i)
printf(" ");
for(j=;j<=(*k-);++j)
printf("*");
printf("\n");
}
return ;
} #endif

2、直接编写Makefile文件

[root@localhost test_2]# vim Makefile
#cjj
main:hello.o star.o
gcc -o main hello.o star.o
hello.o:hello.c hello.h
gcc -c hello.c
star.o:star.c hello.h starfun.h
gcc -c star.c
.PHONY:clean
clean:
rm -f *.o main

make 编译(会出现警告,不影响运行)

运行生成的文件

[root@localhost test_2]# ./main 

删除 .o 文件和 main 文件

3、运用变量编写Makefile文件

#cjj
OBJ=hello.o star.o
CC =gcc
STAR=star.c hello.h starfun.h main:$(OBJ)
$(CC) -o $@ $^
hello.o:hello.c hello.h
$(CC) -c $<
star.o:$(STAR)
$(CC) -c star.c
.PHONY:clean
clean:
rm -f $(OBJ) main

编译并运行

根据给定文件编写Makefile文件 两种方法编译的更多相关文章

  1. Windows文件自删除的两种方法

    可执行模块的自删除技术已经被讨论的很多, 有很多极富创意的思路和想法被提出, 但有些似是而非的方案往往使人误入歧途. 举个例子来说, 很多文章认为下面的一小段代码可以实现自删除:void main(v ...

  2. C#实现Web文件上传的两种方法

    1. C#实现Web文件的上传 在Web编程中,我们常需要把一些本地文件上传到Web服务器上,上传后,用户可以通过浏览器方便地浏览这些文件,应用十分广泛. 那么使用C#如何实现文件上传的功能呢?下面笔 ...

  3. SpringBoot从入门到精通十一(SpringBoot文件上传的两种方法)

    前言 在企业级项目开发过程中,上传文件是最常用到的功能.SpringBoot集成了SpringMVC,当然上传文件的方式跟SpringMVC没有什么出入. 本章目标 使用SpringBoot项目完成单 ...

  4. vba判断文件是否存在的两种方法(转)

    方法1. 用VBA自带的dir()判断,代码如下: 在 Microsoft Windows 中, Dir 支持多字符 (*)和单字符 (?) 的通配符来指定多重文件 Function IsFileEx ...

  5. VC++实现获取文件占用空间大小的两种方法(非文件大小)

    // GetFileSpaceSize.cpp : Defines the entry point for the console application. // /***************** ...

  6. 清除SQLServer日志的两种方法

    日志文件满而造成SQL数据库无法写入文件时,可用两种方法:一种方法:清空日志.1.打开查询分析器,输入命令DUMP TRANSACTION 数据库名 WITH NO_LOG2.再打开企业管理器--右键 ...

  7. 教会你如何编写makefile文件

    最近一直在学习makefile是如何编写的.当我们写的程序文件比较少的时候,敲入gcc /g++,当你在大型工程中,在一个个编译文件的话,你可能就会很郁闷.linux有一个自带的make命令,它让你的 ...

  8. 如何编写makefile文件

    最近一直在学习makefile是如何编写的.       当我们写的程序文件比较少的时候,敲入gcc /g++,当你在大型工程中,在一个个编译文件的话,你可能就会很郁闷.linux有一个自带的make ...

  9. 转:教会你如何编写makefile文件

    最近一直在学习makefile是如何编写的.当我们写的程序文件比较少的时候,敲入gcc /g++,当你在大型工程中,在一个个编译文件的话,你可能就会很郁闷.linux有一个自带的make命令,它让你的 ...

随机推荐

  1. python fromkeys() 创建字典

    # d = dict.fromkeys("张无忌","赵敏") #创建字典 # print(d)#{'张': '赵敏', '无': '赵敏', '忌': '赵敏 ...

  2. Java中的注解基础

    一.元注解 元注解的作用就是负责注解其他注解. 1.@Target @Target用来指明注解所修饰的目标,包括packages.types(类.接口.枚举.Annotation类型).类型成员(方法 ...

  3. Xmind8 (update8)破解教程

    环境:Win7 一.下载xmind: Xmind版本:xmind-8-update8-windows.exe  百度云盘地址: https://pan.baidu.com/s/1ccd18E1hOY1 ...

  4. wepy绘制雷达图

    代码如下: <style lang='less'> .radar-canvas2 { width: 690rpx; height: 420rpx; } </style> < ...

  5. java读取和写入浏览器Cookies

    首先我们认识下什么是cookies: cookie实际上是一个存在你硬盘里的数据,但是这些数据很特殊,只能由web应用提交给浏览器帮助存储,并且我们还能读取浏览器存在本地的cookie web应用一般 ...

  6. 修改oracle表空间数值

    alter database datafile 'D:\oracle\dbfile\DATA.DBF' autoextend on next 100m maxsize 2000M;

  7. MVC项目使用Oracle数据库运行提示:找不到请求的 .Net Framework Data Provider。可能没有安装

    MVC项目使用Entity Framework针对Oracle数据库进行开发时,由于Oracle官方网站一般建议开发者在64位操作系统中使用32位ODP.Net进行开发.在进行程序编码的时候不会有问题 ...

  8. 6.4-6.5 使用form表单验证,完善登录页面

    之前是使用自定义的类来实现登录逻辑,现在使用django内置的form表单验证,用继承django的view来实现登录页面. users > views.py 的内容是: from django ...

  9. Winform开发之SqlCommand常用属性和方法

    SqlCommand类表示要对 SQL Server 数据库执行的一个 Transact-SQL 语句或存储过程,有若干个属性和若干个方法,具体的各类方法使用可以从msdn上找到. 这里介绍几个常用东 ...

  10. Properties集合小应用--限制用户对软件的使用次数

    我们可以注意到一些付费软件可以试用一定的次数,超过限制次数后,就必须到官网购买正版才能继续使用. 这里就简单地模拟一下这种效果的实现. * 需求:记录程序的启动次数,当启动次数超过3次后,要求使用者注 ...