日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

makefile例子《一》

發布時間:2023/12/20 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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例子《一》的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。