下午闲来无聊,就打开很久没动过的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. JVM(三)内存回收(一)

    最近花了相当长一段时间在看Hotspot JVM的GC和内存分配,本节先总结和回顾一下内存回收的相关知识点,内存的分配放到下节再讨论. 一.什么是JVM的GC GC即Garbage Collectio ...

  2. 转 Java输入输出流详解(非常详尽)

    转  http://blog.csdn.net/zsw12013/article/details/6534619 通过数据流.序列化和文件系统提供系统输入和输出. Java把这些不同来源和目标的数据都 ...

  3. Hibernate映射乱码

    1.修改数据库字符集:将数据库默认编码设置为UTF-8 CHARSET=utf8 2.配置Hibernate环境时将数据库URL设置成: jdbc:mysql://localhost:3306/dbN ...

  4. Oracle中如何插入特殊字符:& 和 ' (多种解决方案)-转载

    文章出处:http://blog.sina.com.cn/s/blog_5f39af320101gb3f.html 今天在导入一批数据到Oracle时,碰到了一个问题:Toad提示要给一个自定义变量A ...

  5. 鸟哥Linux学习笔记03

    1, 在Linux中,默认情况下所有的系统上的账号都记录在/etc/passwd这个文件内,密码记录在/etc/shadow这个文件下,所有的组名都记录在/etc/group内,这三个文件可以说是Li ...

  6. web网站更换新域名

    第一步.绑定新的域名到单独的空间 一般我们都是用的VPS或者不限制建站数量的虚拟主机,尽量的保持原有的IP不变,我这边在老站点同IP的VPS主机下新建一个新域名站点,这样我们可以确保原有的站点IP不变 ...

  7. 超简单的js评价小星星

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  8. Apache Spark 2.2.0 中文文档 - Spark 编程指南 | ApacheCN

    Spark 编程指南 概述 Spark 依赖 初始化 Spark 使用 Shell 弹性分布式数据集 (RDDs) 并行集合 外部 Datasets(数据集) RDD 操作 基础 传递 Functio ...

  9. Maven(六)之依赖管理

    前面讲了maven一些关于Maven的简单知识,今天我给大家分享一些Maven的依赖管理.我相信用过maven的人都知道,它很重要的功能就是通过依赖来添加jar包. 让我们领略一下Maven是怎么管理 ...

  10. 关于VisualStudio一运行带中文程序就出错或输出乱码问题的解决

    昨晚纠结了老半天,各种查资料最后终于解决了此问题.今天上午便来编写这篇随笔了!(由于问题已解决,未附上出状况的截图)以下是解决办法: 此问题的原因应是文件的编码问题,选定好出错的文件后,在菜单栏中选择 ...