Linux 下makefile實戰 ——編寫真實的C項目

Linux 下真實的C項目設計

文件目錄說明

  • include 存放自己設計的.h頭文件之所在
  • include/stack.h 棧所使用的頭文件。文件中已經定義出其包含的功能函數。具體請查看文件註釋
  • stack.c 棧的功能函數的實現文件。目前爲空文件。
  • main.c 一個簡單的主程序,調用自定義棧的功能測試入棧、出棧的功能。
  • Makefile make的控制文件。

實現Makefile

  • 實現make命令完成所有編譯、鏈接工作
  • 實現make clean命令可以恢復代碼爲原始狀態

運行結果

在windows下打開linux shell:

Yc5ZqI.png

編譯+鏈接,make一步到位(圖中標號給出了文件生成的順序):

Yc5VsA.png
我們看下makefile的內容:

main:main.o my_stack.o
	gcc main.o my_stack.o -o main
main.o:main.c
	gcc -c main.c
my_stack.o:my_stack.c
	gcc -c my_stack.c

clean:
	if [ -e  main ] ; then rm main ; fi
	if [ -n "ls *.o >/dev/null 2>&1" ] ; then rm *.o ; fi
	

make main 操作完成編譯+鏈接

main.o 獲得可執行文件main.o

my_stack.o 獲得可執行文件mystack.o

make clean 操作刪除所有已經編譯的.o文件和main最終文件

接着來看main.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "include/stack.h"

int main()
{
	//測試手寫的封裝棧
    stack_clear();//初始化棧
	srand((unsigned)time(NULL));
    elem buf;
	for(int i=0;i<10;i++)
	{
		
		buf = rand()%100;
		stack_push(buf);
		printf("當前棧頂元素爲:%d\n",stack_top());
		printf("棧是否爲空(0爲不空,1爲空):%d\n",stack_empty());
		printf("當前棧的大小爲:%d\n",stack_size());
	}
    
    return 0;
}

main.c這部分代碼是測試自己手寫的封裝棧,首先先初始化棧,接着for循環生成10個隨機數,緊接着每次打印棧頂元素和棧的大小,順帶判斷棧是否爲空

再來看my_stack.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "./include/stack.h"
Stack stack;   //爲了方便這裏直接定義全局變量了,用局部變量的話在每個函數加上取地址符和聲明就行了
void stack_pop(){   //元素出棧,此函數無返回值
    stack.top--;
}
void stack_push(elem buf){  //元素入棧
    stack.index[++stack.top] = buf;
}
int stack_empty(){//判空,如果棧爲空的話返回1,否則返回0
    return stack.top == -1;
}
 
void stack_clear(){ ///清空棧
    stack.top = -1;
}
 
int stack_size(){   //求棧內元素數
    return stack.top+1;
}
elem stack_top(){   //返回棧頂元素
    return stack.index[stack.top];
}


my_stack.c是棧功能的實現函數,具體的實現內容則是根據大二上數據結構課程所學,這裏就不再贅述

include 文件夾下 stack.h存放的則是一些預定義函數

#ifndef STACK_H_
#define STACK_H_
#define maxn 110//棧的最大值
typedef int elem;//方便修改數據類型
typedef struct 
{
    int top;    //棧頂的索引
    elem index[maxn];
}Stack;
void stack_pop();   //元素出棧,此函數無返回值
void stack_push(elem buf);//元素入棧
int stack_empty();//判空,如果棧爲空的話返回1,否則返回0
void stack_clear();///清空棧
int stack_size(); //求棧內元素數
elem stack_top(); //返回棧頂元素

#endif

我們接着來看一下運行結果:

Yc5kxH.png

可以看到自己手寫的棧功能運行正常,還沒有出現大的bug~

測試一下make clean:

Yc5EMd.png

Yc5FRe.png

文件夾中的main main.o 已經stack.o都被刪除了,makefile運行正常

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章