makefile例子《一》
一、例子
(1)makefile和src源文件不在同一目錄下
(2)把.o生成到指定目錄下
?
文件結構目錄
----inc????? //放頭文件
----lib //放所需要的.a或者.so文件
----src //放置源文件
----obj ?? //放生成的.o文件
----Makefile??//makefile文件
?
inc有頭文件Hi_String.h
src有源文件Hi_String.cpp
?
?
#compile and lib parameter #編譯參數 #-g表示可以使用gdb調試 #-Wall是所有錯誤和警告在編譯的時候都打出來 #-O2: 包含-O1的優化并增加了不需要在目標文件大小和執行速度上進行折衷的優化. # 編譯器不執行循環展開以及函數內聯.此選項將增加編譯時間和目標文件的執行性能. CC := g++ CCOPT := -g -Wall -O2#當前makefile路徑 CURRENT_PATH := $(shell pwd) #頭文件路徑 INC_PATH := $(CURRENT_PATH)/inc #lib庫路徑 LIB_PATH := $(CURRENT_PATH)/lib #源文件路徑 SRC_PATH := $(CURRENT_PATH)/src #object文件路徑 OBJS_PATH := $(CURRENT_PATH)/obj#源文件,自動找所有.cpp文件,并將目標定義為同名.o文件 #wildcard:擴展通配符 notdir:去除路徑 patsubst:替換通配符 SRC_FILE_DIR := $(wildcard $(SRC_PATH)/*.cpp) SRC_FILE :=$(notdir $(SRC_FILE_DIR)) #把所有.cpp變成.o文件;這里有兩種表達方法 #(1)OBJS_FILE := $(SRC_FILE:.cpp=.o) #(2)OBJS_FILE := $(patsubst %.cpp,%.o,$(SRC_FILE)) OBJS_FILE := $(SRC_FILE:.cpp=.o)OBJS:=$(OBJS_PATH)/$(OBJS_FILE)TARGET := Hi_String$(OBJS_PATH)/%.o:$(SRC_PATH)/%.cpp$(CC) $(CCOPT) -I$(INC_PATH) -c $^ -o $@$(TARGET) : $(OBJS)$(CC) $(CCOPT) -I$(INC_PATH) -o $@ $^.PHONY : clean clean : rm -rf $(TARGET)rm -rf $(OBJS)? 這樣會把.o文件生成到obj里面;
把最終可執行文件生成到Makefile一起的目錄下
?
二、wildcard、notdir、patsubst(轉)
(http://www.cnblogs.com/rayfloyd/archive/2012/12/04/2800995.html)
1、wildcard : 擴展通配符
2、notdir : 去除路徑
3、patsubst :替換通配符
例子:
建立一個測試目錄,在測試目錄下建立一個名為sub的子目錄
$ mkdir test
$ cd test
$ mkdir sub
在test下,建立a.c和b.c2個文件,在sub目錄下,建立sa.c和sb.c2 個文件
建立一個簡單的Makefile
src=$(wildcard *.c ./sub/*.c)
dir=$(notdir $(src))
obj=$(patsubst %.c,%.o,$(dir) )
all:
@echo $(src)
@echo $(dir)
@echo $(obj)
@echo "end"
執行結果分析:
第一行輸出:
a.c b.c ./sub/sa.c ./sub/sb.c
wildcard把 指定目錄 ./ 和 ./sub/ 下的所有后綴是c的文件全部展開。
第二行輸出:
a.c b.c sa.c sb.c
notdir把展開的文件去除掉路徑信息
第三行輸出:
a.o b.o sa.o sb.o
在$(patsubst %.c,%.o,$(dir) )中,patsubst把$(dir)中的變量符合后綴是.c的全部替換成.o,
任何輸出。
或者可以使用
obj=$(dir:%.c=%.o)
效果也是一樣的。
這里用到makefile里的替換引用規則,即用您指定的變量替換另一個變量。
它的標準格式是
$(var:a=b) 或 ${var:a=b}
它的含義是把變量var中的每一個值結尾用b替換掉a
今天在研究makefile時在網上看到一篇文章,介紹了使用函數wildcard得到指定目錄下所有的C語言源程序文件名的方法,這下好了,不用手工一個一個指定需要編譯的.c文件了,方法如下:
SRC = $(wildcard *.c)
等于指定編譯當前目錄下所有.c文件,如果還有子目錄,比如子目錄為inc,則再增加一個wildcard函數,象這樣:
SRC = $(wildcard *.c) $(wildcard inc/*.c)
?
?
?
?
轉載于:https://www.cnblogs.com/ztteng/p/3251350.html
總結
以上是生活随笔為你收集整理的makefile例子《一》的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: How Tomcat Works(二十)
- 下一篇: android如何让service不被杀