如图,用makefile调试冒泡排序,我的主函数在bubblesort文件夹中,此文件夹中还有一个文件夹sort保存了头文件和源文件,然后就是编写makefile命令来make生成可执行文件。
内容:bubblesort.h
#ifndef _BUBBLESORT_H
#define _BUBBLESORT_H
/***************
冒泡排序的声明
输入:数组首地址, 元素个数
输出:有序的数组
返回值:void
****************/
void bubble_sort(int array[], int n);
#endif
bubble.c
#include <stdio.h>
#include "bubblesort.h"
void bubble_sort(int array[], int n)
{
int i, j, t; //定义循环变量,t为交换的临时变量
int lastchange; //记录最后交换的位置
i = n-1;
while(i > 0)
{
lastchange = 0;
for(j = 0; j < i; j++) //有序时,时间复杂度变为O(n)
{
if(array[j+1] < array[j])
{
t = array[j]; //交换两个数的值
array[j] = array[j+1];
array[j+1] = t;
lastchange = j; //更新最后交换的位置
}
}
i = lastchange;
}
}
下面是我写的makefile文件内容,有两个:
test:main.o ./sort/bubble.o
gcc main.o ./sort/bubble.o -o test
main.o:main.c ./sort/bubble.c
gcc -c main.c ./sort/bubble.c -o main.o -I ./sort
bubble.o:./sort/bubble.c
gcc -c ./sort/bubble.c -o bubble.o -I ./sort
clean:
rm -f *~ *.o
或是
test:main.o ./sort/bubble.o
gcc main.o ./sort/bubble.o -o test
main.o:main.c ./sort/bubblesort.h
gcc -c main.c -o main.o -I ./sort
bubble.o:./sort/bubble.c
gcc -c ./sort/bubble.c -o bubble.o -I ./sort
clean:
rm -f *~ *.o
1、第一行test是目标文件,他依赖于main.o和bubble.o文件,所以在说明依赖的时候要说明文件路径
2、第二行编译命令,根据生成的*.o生成可执行文件
3、第三行是main.o的生成,依赖于main.c 和头文件,这里两种写法的不同就是一个写的源文件,一个写的头文件,之前一直出错,就是第四行后面,没有写明 -I ./sort,系统不知道去哪里找头文件,所以一直是bubblesort.h找不到。
4下面bubble.o的生成和main.o是一样的
5下面的clean动作是删除中间的临时文件
当存在子文件夹时,我们还可以在子文件夹中写一个makefile,执行可以这样改:
子文件夹中makefile:
bubble.o:bubble.c
gcc -c bubble.c -o bubble.o -I ./sort
bubblesort文件夹中makefile:
test:main.o ./sort/bubble.o
gcc main.o ./sort/bubble.o -o test
main.o:main.c ./sort/bubblesort.h
gcc -c main.c -o main.o -I ./sort
bubble.o:./sort/bubble.c
cd ./sort && make
clean:
rm -f *~ *.o
其中就是改掉了生成子文件夹中bubble.o的命令,改为了cd ./sort && make,就是先打开到sort文件夹然后执行make,这是允许的。
还有一种方法就是利用include关键字来包含子文件夹中的make文件。
sort文件夹中建立一个make文件a.mk
bubble.o:bubble.c
gcc -c bubble.c -o bubble.o -I ./sort
bubblesort文件夹中的makefile文件:
#include "./sort/a.mk"
test:main.o ./sort/bubble.o
gcc main.o ./sort/bubble.o -o test
main.o:main.c ./sort/bubblesort.h
gcc -c main.c -o main.o -I ./sort
clean:
rm -f *~ *.o