Makefile学习(三)[第二版]

来源:互联网 发布:网络与系统攻击技术 编辑:程序博客网 时间:2024/04/30 21:35

复杂实例

#示例1:在上一个示例的基础上再增加一个可执行文件03test[修改之处已标红]

.PHONY: clean all 

 

CC = gcc 

CFLAGS = -Wall -g

BIN = 01test 02test 03test

SOURCES = $(BIN:=.c)

OBJECTS = $(BIN:=.o)

 

all: $(BIN)

 

01test: 01test.o

02test: 02test.o

03test: 03test.o

 

.c.o:

    $(CC) $(CFLAGS) -c $< -o $@

 

clean:

    -rm -rf $(BIN) $(OBJECTS)

 

#示例2:在示例1上为03test添加一个自编的头文件pub.h[修改之处已标红]

.PHONY: clean all 

 

CC = gcc 

CFLAGS = -Wall -g

BIN = 01test 02test 03test

SOURCES = $(BIN:=.c)

OBJECTS = $(BIN:=.o)

 

all: $(BIN)

 

01test: 01test.o

02test: 02test.o

03test: 03test.o pub.o

 

.c.o:

    $(CC) $(CFLAGS) -c $< -o $@

 

clean:

    -rm -rf $(BIN) $(OBJECTS)

 

一个比较复杂的综合示例


[cpp] view plain copy
print?
  1. //1 pub.cpp  
  2. int pub(int a,char *ch,int b)  
  3. {  
  4.     char c = ch[0];  
  5.     switch(c)  
  6.     {  
  7.         case '+':  
  8.             return a+b;  
  9.             break;  
  10.         case '-':  
  11.             return a-b;  
  12.             break;  
  13.         case '*':  
  14.             return a*b;  
  15.             break;  
  16.         case '/':  
  17.             if (b != 0)  
  18.             {     
  19.                 return a/b;  
  20.             }     
  21.             else  
  22.             {     
  23.                 return -1;  
  24.             }  
  25.             break;  
  26.         default:  
  27.             return -1;  
  28.             break;  
  29.     }  
  30.   
  31.     return 0;  
  32. }  



[cpp] view plain copy
print?
  1. //3 main.cpp  
  2. #include <iostream>  
  3. #include <stdlib.h>  
  4. #include "pub.h"  
  5. using namespace std;  
  6.   
  7. int main(int argc,char *argv[])  
  8. {  
  9.     if (argc < 4)  
  10.     {     
  11.         cerr << "error" << endl;  
  12.         return -1;   
  13.     }     
  14.   
  15.     cout << argv[1] << ' ' << argv[2] << ' ' << argv[3] << " = "   
  16.          << pub(atoi(argv[1]),argv[2],atoi(argv[3])) << endl;  
  17.   
  18.     return 0;  
  19. }  

#4 Mackfile.SUFFIXES:.cpp .o CC=g++SOURCE=main.cpp pub.cppOBJC=$(SOURCE:.cpp=.o)#将.cpp文件全部替换为.o文件EXEC=mytest all:$(OBJC)$(CC) -o $(EXEC) $(OBJC) .cpp.o:$(CC) -o $@ -c $< clean:rm -rf $(OBJC)



附-如果一条语句在执行Mackfile文件时,不想打印出来,则在其前面加上@符号

 

比较专业的Makefile编写

#示例1

all: myapp # Which compilerCC = g++  # Where are include files keptINCLUDE = . # Options for developmentFLAGS = -g -Wall -ansi # Options for release# CFLAGS = -O -Wall -ansi .SUFFIXES:.cpp .o SOURCE = main.cpp pub.cppOBJC = $(SOURCE:.cpp=.o)EXEC = myapp $(EXEC): ${OBJC}$(CC) -o $(EXEC) $(OBJC)  .cpp.o:$(CC) -o $@ -I$(INCLUDE) $(FLAGS) -c $< clean:rm -rf $(OBJC) $(EXEC)

#示例2-添加了install选项

all: myapp # Which compilerCC = g++  # Where to installINSTDIR = /usr/local/bin/ # Where are inlude files keptINCLUDE = . # Options for developmentCFLAGS = -g -Wall -ansi # Options for release# CFLAGS = -O -Wall -ansi .SUFFIXES: .cpp .o SOURCE = main.cpp pub.cppOBJECT = $(SOURCE:.cpp=.o)EXEC   = myapp $(EXEC): $(OBJECT)    $(CC) -o $(EXEC) $(OBJECT) .cpp.o:    $(CC) -I$(INCLUDE) $(CFLAGS) -o $@ -c $< clean:    -rm -rf $(OBJECT) install: $(EXEC)    @if [ -d $(INSTDIR) ] ; then \        cp $(EXEC) $(INSTDIR) ; \        chmod a+x $(INSTDIR)/$(EXEC) ; \        chmod og-w $(INSTDIR)/$(EXEC) ; \        echo "Installed in $(INSTDIR)" ; \    else \        echo "Sory, $(INSTDIR) does not exist." ; \    fi


0 0