下午闲来无聊,就打开很久没动过的linux系统想熟悉熟悉在linux上面编译代码,结果一个makefile文件搞到晚上才搞定,哈哈!

先把代码简单贴上来,就写了一个冒泡排序:

sort.h:

#ifndef SORT_H
#define SORT_H #include<stdio.h>
#include<time.h>
#include<stdlib.h> #define N 10
#define swap(a,b) {a^=b;b^=a;a^=b;}
#define ins(a,b,c) for( a = b ; a < c ; ++a) void bub_sort(); #endif

sort.c:

#include"sort.h"
void bub_sort(){
int *in;
int i , j;
in = malloc(N*sizeof(int));
srand((unsigned)time(NULL));
ins(i,0,N){
in[i] = rand()%100;
} ins(i,0,N){
printf("%d%s",in[i],i == N-1 ? "\n" : "->");
} ins(i,0,N-1){
ins(j,i,N){
if(in[i] > in[j]){
swap(in[i] , in[j]);
}
}
} ins(i,0,N){
printf("%d%s" , in[i] , i == N-1 ? "\n" : "->");
}
free(in);
in = NULL;
}

main.c:

#include"sort.h"

int main(){
bub_sort();
return 0;
}

如果直接编译的话得用三条指令:

gcc -c sort.c -o sort.o

gcc -c main.c -o main.o

gcc main.o sort.o -o main

  

每一次编译的时候如果都得敲这三行代码就显得效率很低了,所以尝试着写一个makefile文件;

编写makefile时有一定的规则:

目标(target) : 需要的条件(dependencies) (注意冒号两边有空格)

    命令(system command)  (注意前面用tab键开头)

  解释一下:

  1 目标可以是一个或多个,可以是Object File,也可以是执行文件,甚至可以是一个标签。

  2 需要的条件就是生成目标所需要的文件或目标

  3 命令就是生成目标所需要执行的脚本

  总结一下,就是说一条makefile规则规定了编译的依赖关系,也就是目标文件依赖于条件,生成规则用命令来描述。在编译时,如果需要的条件的文件比目标更新的话,就会执行生成命令来更新目标。

makefile:

OBJS = main.o sort.o

main: $(OBJS)
gcc $(OBJS) -o main //注意:命令前面必须为(tab)
main.o: main.c sort.h
gcc -c main.c -o main.o
sort.o: sort.c sort.h
gcc -c sort.c -o sort.o
clean:
rm -rf *.o main

上面的makefile文件中执行四条指令:

第一:

main: $(OBJS)                #main依赖于main.o sort.o

(tab)gcc $(OBJS) -o main     #命令行,前面必须为tab,编译出main可执行文件。-o表示你指定 的目标文件名。
第二:
main.o: main.c sort.h            #main.o依赖于main.c sort.h
  gcc -c main.c -o main.o         编译出file1.o文件。-c表示gcc 只把给它的文件编译成目标文件, 用源码文件的文件名命名但把其后缀由“.c”变成“.o”。在这句中,可以省略-o file1.o,编译器默认生成file1.o文件,这就是-c的作用。
第三:
sort.o: sort.c sort.h            #与第二类似
gcc -c sort.c -o sort.o
第四:
clean:
rm -rf *.o main
当用户键入make clean命令时,会删除*.o 和helloworld文件。

写好makefile,在终端里面直接键入make就会执行makefile中的指令了:

m@m-computer:~/c学习/hello$ make
gcc main.o sort.o -o main m@m-computer:~/c学习/hello$ ls
main main.c main.o makefile sort.c sort.h sort.o m@m-computer:~/c学习/hello$ ./main
84->6->29->53->82->74->42->55->20->56
6->20->29->42->53->55->56->74->82->84

  

参考:http://goodcandle.cnblogs.com/archive/2006/03/30/278702.html

一个简单的makefile文件编写的更多相关文章

  1. 一个简单的makefile文件

    一个简单的makefile文件:可以编译指定目录下的所有c和cpp文件,暂未加入自动头文件的依赖. #!/bin/bash #编译器 CROSS_COMPILING_PATH = #源文件路径 VPA ...

  2. 一个简单的Makefile的编写【用自己的话,解释清楚这些】

    用自己的话,解释清楚这些~ Makefile是程序员编写出来指导编译器编译程序源码为目标文件(可执行文件,或链接库) 这里只写一个简单的Makefile 作为例子 其需求如下: frank@ubunt ...

  3. 编写一个通用的Makefile文件

    1.1在这之前,我们需要了解程序的编译过程 a.预处理:检查语法错误,展开宏,包含头文件等 b.编译:*.c-->*.S c.汇编:*.S-->*.o d.链接:.o +库文件=*.exe ...

  4. Linux Makefile文件编写详细步骤与实践

    Linux Makefile文件编写详细步骤与实践 1.makefile概述 Windows环境下IDE会帮你完成makefile文件的编写,但在UNIX环境下你就必须自己写makefile了,会不会 ...

  5. 转:SYNOPSYS VCS Makefile文件编写与研究

    SYNOPSYS VCS Makefile文件编写与研究 这个Makefile是synopsys提供的模板,看上去非常好用,你只要按部就班提供实际项目的参数就可以了.我们来看这个文件的头部说明:mak ...

  6. GNU Make 学习系列一:怎样写一个简单的Makefile

    编程通常遵循一个相当简单的程序:编辑源文件,编译源代码成可执行的格式,调试结果.尽管将源代码翻译成可执行程序是常规的过程,如果做的不正确,程序员可能会浪费大量的时间去追踪问题.大多数的开发者都经历过这 ...

  7. 【OpenWRT】【RT5350】【三】MakeFile文件编写规则和OpenWRT驱动开发步骤

    一.Makefile文件编写 http://www.cnblogs.com/majiangjiang/articles/3218002.html 可以看下上面的博客,总结的比较全了,在此不再复述 二. ...

  8. ubuntu14.04 配置g++工具,并运行一个简单的c++文件

    首先,对Ubuntu 14.04 LTS进行源更新,摘自下述链接: http://chenrongya.blog.163.com/blog/static/8747419620143185103297/ ...

  9. makefile文件编写

    文件转载自:http://www.cppblog.com/lapcca/archive/2010/11/26/134714.html 下面这篇文章讲的很清楚,基本的用法也很简单.   一.Makefi ...

随机推荐

  1. 笔记2 linux多线程 读写锁

    //read write lock #include<stdio.h> #include<unistd.h> #include<pthread.h> struct ...

  2. [3] 微信公众号开发 - 结合UEditor实现图文消息群发功能

    0.写在前面的话 如何实现微信平台后台管理中的,图文消息发送功能? 大概的过程如下: 通过类似表单的形式,将文章各部分内容提交到后台,封装成一个实体类,并持久化到数据库中 需要推送的时候,将不同的文章 ...

  3. Oracle单引号的用法-转义

    在ORACLE中,单引号有两个作用:  1:字符串是由单引号引用  2:转义. 单引号的使用是就近配对.而在单引号充当转义角色时相对不好理解 1.从第二个单引号开始被视为转义符,如果第二个单引号后面还 ...

  4. SDP开发

    1.1 前言 在企业间的商业竞争越来越激烈的今天,如何快速实现客户需求,如果快速方开发.修改.更新系统功能,如何降低软件研发的成本等等,在此目标基础上研发了软件快速开发(SDP)工具.通过平台设计器快 ...

  5. String类的源码分析

    之前面试的时候被问到有没有看过String类的源码,楼主当时就慌了,回来赶紧补一课. 1.构造器(构造方法) String类提供了很多不同的构造器,分别对应了不同的字符串初始化方法,此处从源码中摘录如 ...

  6. 认识StringBuffer类

    概述: StringBuffer类是线程安全的可变字符序列 线程安全效率低 StringBuffer和String的区别 * String是一个不可变的字符序列 * StringBuffer是一个可变 ...

  7. MySQL索引优化实例说明

    下面分别创建三张表,并分别插入1W条简单的数据用来测试,详情如下: [1] test_a 有主键但无索引   CREATE TABLE `test_a` (   `id` int(10) unsign ...

  8. 策略模式Strategy

    定义一系列的算法,把他们封装起来,使得算法独立于适用对象. 比如,一个系统有很多的排序算法,但是使用哪个排序算法是客户对象的自有.因此把每一个排序当做一个策略对象,客户调用哪个对象,就使用对应的策略方 ...

  9. 我的第一个python web开发框架(2)——一个简单的小外包

    第一部分说明 第一部分大概有20来章,主要讲的是一些开发常识.开发前中后期准备内容.开发环境与服务器部署环境安装设置.python基础框架结构与功能等内容,代码会比较简单. 本系列会以故事的方式,向大 ...

  10. Java虚拟中内存分块

    Java虚拟机JVM(Java Virtual Machine)中内存分块 JAVA中通常分为5个区域虚拟机栈.堆.方法区.程序计数器.本地方法区.我们一般讲的是Java虚拟机管理的四个区域虚拟机栈. ...