根据给定文件编写Makefile文件 两种方法编译
实例一
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文件 两种方法编译的更多相关文章
- Windows文件自删除的两种方法
可执行模块的自删除技术已经被讨论的很多, 有很多极富创意的思路和想法被提出, 但有些似是而非的方案往往使人误入歧途. 举个例子来说, 很多文章认为下面的一小段代码可以实现自删除:void main(v ...
- C#实现Web文件上传的两种方法
1. C#实现Web文件的上传 在Web编程中,我们常需要把一些本地文件上传到Web服务器上,上传后,用户可以通过浏览器方便地浏览这些文件,应用十分广泛. 那么使用C#如何实现文件上传的功能呢?下面笔 ...
- SpringBoot从入门到精通十一(SpringBoot文件上传的两种方法)
前言 在企业级项目开发过程中,上传文件是最常用到的功能.SpringBoot集成了SpringMVC,当然上传文件的方式跟SpringMVC没有什么出入. 本章目标 使用SpringBoot项目完成单 ...
- vba判断文件是否存在的两种方法(转)
方法1. 用VBA自带的dir()判断,代码如下: 在 Microsoft Windows 中, Dir 支持多字符 (*)和单字符 (?) 的通配符来指定多重文件 Function IsFileEx ...
- VC++实现获取文件占用空间大小的两种方法(非文件大小)
// GetFileSpaceSize.cpp : Defines the entry point for the console application. // /***************** ...
- 清除SQLServer日志的两种方法
日志文件满而造成SQL数据库无法写入文件时,可用两种方法:一种方法:清空日志.1.打开查询分析器,输入命令DUMP TRANSACTION 数据库名 WITH NO_LOG2.再打开企业管理器--右键 ...
- 教会你如何编写makefile文件
最近一直在学习makefile是如何编写的.当我们写的程序文件比较少的时候,敲入gcc /g++,当你在大型工程中,在一个个编译文件的话,你可能就会很郁闷.linux有一个自带的make命令,它让你的 ...
- 如何编写makefile文件
最近一直在学习makefile是如何编写的. 当我们写的程序文件比较少的时候,敲入gcc /g++,当你在大型工程中,在一个个编译文件的话,你可能就会很郁闷.linux有一个自带的make ...
- 转:教会你如何编写makefile文件
最近一直在学习makefile是如何编写的.当我们写的程序文件比较少的时候,敲入gcc /g++,当你在大型工程中,在一个个编译文件的话,你可能就会很郁闷.linux有一个自带的make命令,它让你的 ...
随机推荐
- Markdown中的表格
参考:在简书上用Markdown写表格 | Tables | Are | Cool | | ------------- |:-------------:| -----:| | col 3 is | r ...
- [转]Python的getattr(),setattr(),delattr(),hasattr()
getattr()函数是Python自省的核心函数,具体使用大体如下: 获取对象引用getattrGetattr用于返回一个对象属性,或者方法 class A: def __init__(self): ...
- JAVA技术分享:消失的线程
很多小伙伴都问过我一个问题,就是任务线程跑着跑着消失了,而且没有任何异常日志.我都是条件反射式的回复,是不是用了线程池的submit提交任务.而且很大几率对方给予肯定答复. 解决方案,很多人都听过不少 ...
- mongo学亮的分享
# MongoDB 集群部署## 关键词* 集群* 副本集* 分片## MongoDB集群部署>今天主要来说说Mongodb的三种集群方式的搭建Replica Set副本集 / Sharding ...
- maven 工程mybatis自动生成实体类
generatorConfig.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE ge ...
- 牛客网——G送分了(py)
链接:https://www.nowcoder.net/acm/contest/74/G来源:牛客网 题目描述 杭州人称傻乎乎的人为62,而嘟嘟家这里没有这样的习俗. 相比62,他那里的人更加讨厌数字 ...
- MyBatis Generator去掉生成的注解
是不是很讨厌mybatis Generator帮我们生成代码的时候在Mapper和mapper.xml文件中生成的一大堆注解?今天在看MyBatis Generator代码的时候发现,原来mybati ...
- 黑暗世界的搜索引擎 https://fofa.so/ https://www.shodan.io https://www.zoomeye.org 查找设备漏洞
from:http://www.freebuf.com/sectool/121339.html 什么是 Shodan? 首先,Shodan 是一个搜索引擎,但它与 Google 这种搜索网址的搜索引擎 ...
- ENUMSTXT.H中的指针数组
/************************************************************************ ...
- python自动化运维之路03
set集合 集合是一个无序的.不可重复的集合.主要作用有: 1.去重,把一个列表变成集合,就等于去重了. 2.关系测试,测试两组数据之前的交集.差集.并集等关系 常用操作 创建.交集.并集.差集.对称 ...