工程中的代碼分別存放在add/add_int.c、add/add_float.c、add/add.h、sub/sub_int.c、sub/sub_float.c、sub/sub.h、main.c中。函數
文件main.c優化
#include <stdio.h>spa
#include "add.h" 命令行
#include "sub.h"xml
int main(void)字符串
{input
int input = 0;io
int a = 10, b = 12;編譯
float x= 1.23456,y = 9.87654321;變量
printf("int a+b IS:%d\n",a+b);
printf("int a-b IS:%d\n",a-b);
printf("float x+y IS:%f\n",x+y);
printf("float x-y IS:%f\n",x-y);
return 0;
}
加操做
#ifdef __ADD_H__
#define __ADD_H__
extern int add_int(int a, int b);
extern float add_float(float a, float b);
#endif
float add_float(float a, float b)
{
return a+b;
}
int add_int(int a, int b)
{
return a+b;
}
減操做
#ifdef __ADD_H__
#define __ADD_H__
extern float sub_float(float a, float b);
extern int sub_int(int a, int b);
#endif
float sub_float(float a, float b)
{
return a-b;
}
int sub_int(int a, int b)
{
return a-b;
}
命令行編譯程序:
#gcc -c add/add_int.c -o add/add_int.o #生成add_int.o目標函數
#gcc -c add/add_float.c -o add/add_float.o #生成add_float.o目標函數
#gcc -c sub/sub_int.c -o sub/sub_int.o #生成sub_int.o目標函數
#gcc -c sub/sub_float.c -o sub/sub_float.o #生成sub_float.o目標函數
#gcc -c main.c -o main.o #生成main.o目標函數
#gcc -o casu add/add_int.o add/add_float.o sub/sub_int.o sub/sub_float.o main.o
#連接生成cacu
多文件的makefile:
#生成casu,「;」右邊爲目標
casu:add_int.o add_float.o sub_int.o sub_float.o main.o
gcc -o casu add/add_int.o add/add_float.o \ # \爲鏈接符
sub/sub_int.o sub/sub_float.o main.o
#生成add_int.o的規則,將add_int.c編譯生成目標文件add_int.o
add_int.o:add/add_int.c add/add.h
gcc -c -o add/add_int.o add/add_int.c
#生成add_float.o的規則
add_float.o:add/add_float.c add/add.h
gcc -c -o add/add_float.o add/add_float.c
#生成sub_int.o的規則
sub_int.o:sub/sub_int.c sub/sub.h
gcc -c -o sub/sub_int.o sub/sub_int.c
#生成sub_float.o的規則
sub_float.o:sub/sub_float.c sub/sub.h
gcc -c -o sub/sub_float.o sub/sub_float.c
#生成main.o的規則
main.o:main.c add/add.h sub/sub.h
gcc -c -o main.o main.c -Iadd -Isub
#清理規則
clean:
rm -f casu add/add_int.o add/add_float.o \
sub/sub_int.o sub/sub_float.o main.o
使用自定義變量的makefile文件:
CC = gcc #CC定義成gcc
CFLAGES = -Iadd -Isub -O2 #加入頭文件搜索路徑sub和add,O2爲優化#目標文件
OBJS = add/add_int.o add/add_float.o \
sub/sub_int.o sub/sub_float.o main.o
TARGET = casu #生成的可執行文件
RM = rm -f #刪除的命令
$(TARGET):$(OBJS) #TARGET目標,須要先生成OBJS目標
$(CC) -o $(TARGET) $(OBJS) $(CFLAGES) #生成可執行文件
$(OBJS):%.o:%.c #將OBJS中全部擴展名爲.o的文件替換成擴展名爲.c的文件
$(CC) -c $(CFLAGES) $< -o $@ #採用CFLAGS指定的選項編譯生成目標文件
clean: #清理
-$(RM) $(TARGET) $(OBJS) #刪除全部的目標文件和可執行文件
使用預約義變量的makefile文件:
CFLAGES = -Iadd -Isub -O2 #編譯選項
OBJS = add/add_int.o add/add_float.o \
sub/sub_int.o sub/sub_float.o main.o
TARGET = casu #生成的可執行文件
$(TARGET):$(OBJS) #TARGET目標,須要先生成OBJS目標
$(CC) -o $(TARGET) $(OBJS) $(CFLAGES) #生成可執行文件
$(OBJS):%.o:%.c #將OBJS中全部擴展名爲.o的文件替換成擴展名爲.c的文件
$(CC) -c $(CFLAGES) $< -o $@ #採用CFLAGS指定的選項編譯生成目標文件
clean: #清理
-$(RM) $(TARGET) $(OBJS) #刪除全部的目標文件和可執行文件
使用自動變量的makefile文件:
CFLAGES = -Iadd -Isub -O2 #編譯選項
OBJS = add/add_int.o add/add_float.o \
sub/sub_int.o sub/sub_float.o main.o
TARGET = casu #生成的可執行文件
$(TARGET):$(OBJS) #TARGET目標,須要先生成OBJS目標
$(CC) -o $@ $^ $(CFLAGES) #生成可執行文件
$(OBJS):%.o:%.c #將OBJS中全部擴展名爲.o的文件替換成擴展名爲.c的文件
$(CC) -c $< $(CFLAGES) -o $@ #採用CFLAGS指定的選項編譯生成目標文件
clean: #清理
-$(RM) $(TARGET) $(OBJS) #刪除全部的目標文件和可執行文件
使用搜索路徑的makefile文件:
CFLAGES = -Iadd -Isub -O2
OBJSDIR = .objs
VPATH = add:sub:.
OBJS = add_int.o add_float.o sub_int.o sub_float.o main.o
TARGET = casu
$(TARGET):$(OBJSDIR) $(OBJS) #先檢測OBJSDIR和OBJS依賴項是否存在
$(CC) -o $(TARGET) $(OBJSDIR)/*.o $(CFLAGES)
#將OBJSDIR目錄中全部的.o文件連接成casu
$(OBJS):%.o:%.c
$(CC) -c $< $(CFLAGES) -o $(OBJSDIR)/$@ #生成目標文件,存放在OBJSDIR目錄中
$(OBJSDIR):
mkdir -p ./$@ #創建目錄,-p選項能夠忽略父目錄不存在的錯誤
clean:
-$(RM) $(TARGET) #刪除casu
-$(RM) $(OBJSDIR)/*.o #刪除OBJSDIR目錄下的全部.o文件
使用自動推導規則的makefile:
CFLAGS = -Iadd -Isub -O2 # 用戶自定義變量
VPATH=add:sub # 搜索路徑
OBJS = add_int.o add_float.o sub_int.o sub_float.o main.o
TARGET = cacu
$(TARGET):$(OBJS) #OBJS依賴項的規則自動生成
$(CC) -o $(TARGET) $(OBJS) $(CFLAGS) #連接文件
clean:
-$(RM) $(TARGET) #「-」表示當前操做失敗時不報錯,命令繼續執行
-$(RM) $(OBJS)
使用函數的makefile文件:
CC = gcc #CC定義成gcc
VPATH =add:sub
CFLAGES = -Iadd -Isub -O2 #加入頭文件搜索路徑sub和add,O2爲優化#目標文件
TARGET = casu #生成的可執行文件
DIRS = sub add . #DIRS字符串的值爲目錄add、sub和當前目錄
FILES = $(foreach dir, $(DIRS),$(wildcard $(dir)/*.c)) #查找所用目錄下的.c文件
OBJS = $(patsubst %.c,%.o,$(FILES)) #將.c替換成.o
$(TARGET):$(OBJS) #TARGET目標,須要先生成OBJS目標
$(CC) -o $(TARGET) $(OBJS) $(CFLAGES) #生成可執行文件
clean: #清理
-$(RM) $(TARGET) $(OBJS) #刪除全部的目標文件和可執行文件