1. 程式人生 > >一點一點學寫Makefile(6)-遍歷當前目錄原始檔及其子目錄下原始檔

一點一點學寫Makefile(6)-遍歷當前目錄原始檔及其子目錄下原始檔

有時候,我們在開發的時候需要將本次工程的程式碼分成多個子目錄來編寫,但是在Makefile的編寫上卻是個問題,下面我就教大家怎麼構建帶有子資料夾的原始碼目錄的自動掃描編譯

下面這張圖是我的檔案樹


這裡面src目錄下是我的原始碼,我將功能程式碼分成了三個子模組,分別為test1, test2, test3, 呼叫這三個子模組的是main.cpp檔案,下面我將這三個子模組的程式碼

//  src/test1/test1.h
#ifndef __TEST1_H__
#define __TEST1_H__
int test1();
#endif //__TEST1_H__

// src/test1/test1.cpp
#include "test1.h"

int test1() {
	return 1;	
}

<pre name="code" class="cpp">//  src/test2/test2.h
#ifndef __TEST2_H__
#define __TEST2_H__
int test2();
#endif //__TEST2_H__

// src/test2/test2.cpp
#include "test2.h"

int test2() {
	return 2;	
}

//  src/test3/test3.h
#ifndef __TEST3_H__
#define __TEST3_H__
int test3();
#endif //__TEST3_H__

// src/test3/test3.cpp
#include "test3.h"

int test3() {
	return 3;	
}

// src/main.cpp
#include <iostream>
#include "test1/test1.h"
#include "test2/test2.h"
#include "test3/test3.h"

using namespace std;

int main() {
    cout << "test1()" << test1() << endl;
    cout << "test2()" << test2() << endl;
    cout << "test3()" << test3() << endl;
}

Makefile遍歷的核心程式碼如下:

SRC_PATH = ./src
DIRS = $(shell find $(SRC_PATH) -maxdepth 3 -type d)

# 為了更大幅度的支援專案的搭建,將三種檔案格式的字尾都單獨便利到變數中
SRCS_CPP += $(foreach dir, $(DIRS), $(wildcard $(dir)/*.cpp))
SRCS_CC += $(foreach dir, $(DIRS), $(wildcard $(dir)/*.cc))
SRCS_C += $(foreach dir, $(DIRS), $(wildcard $(dir)/*.c))

OBJS_CPP = $(patsubst %.cpp, %.o, $(SRCS_CPP))
OBJS_CC = $(patsubst %.cc, %.o, $(SRCS_CC))
OBJS_C = $(patsubst %.c, %.o, $(SRCS_C))

下面是Makefile的全部檔案  ---- 對於其他出現的語法,請參考我寫的請他部落格,還是不懂,請留言評論
[[email protected] makefile]# cat Makefile 
CROSS = 
CC = $(CROSS)gcc
CXX = $(CROSS)g++
DEBUG = 
CFLAGS = $(DEBUG) -Wall -c
MV = mv -f
RM = rm -rf
LN = ln -sf

TARGET = classify

TOP_PATH = $(shell pwd)
SRC_PATH = $(TOP_PATH)/src
MOD_PATH = $(TOP_PATH)/modules
MOD_LIB_PATH = $(MOD_PATH)/lib
MOD_INC_PATH = $(MOD_PATH)/include
DIRS = $(shell find $(SRC_PATH) -maxdepth 3 -type d)
FILES = $(foreach dir, $(DIRS), $(wildcard $(dir)/*.cpp))

##########################################################
# modules
##########################################################
modules = 
MODULES_PATH = $(foreach m, $(modules), $(MOD_PATH)/$(m))

##########################################################
# srcs
##########################################################
SRCS_CPP += $(foreach dir, $(DIRS), $(wildcard $(dir)/*.cpp))
SRCS_CC += $(foreach dir, $(DIRS), $(wildcard $(dir)/*.cc))
SRCS_C += $(foreach dir, $(DIRS), $(wildcard $(dir)/*.c))

##########################################################
# objs
##########################################################
OBJS_CPP = $(patsubst %.cpp, %.o, $(SRCS_CPP))
OBJS_CC = $(patsubst %.cc, %.o, $(SRCS_CC))
OBJS_C = $(patsubst %.c, %.o, $(SRCS_C))

##########################################################
# paths
##########################################################
INC_PATH += -I$(MOD_INC_PATH)
INC_PATH += -I$(MOD_PATH)
LIB_PATH += -L$(TOP_PATH)/lib
LIB_PATH += -L$(MOD_LIB_PATH)

##########################################################
# libs
##########################################################

##########################################################
# building
##########################################################
all:$(TARGET)

$(TARGET) : $(OBJS_CPP) $(OBJS_CC) $(OBJS_C)
	@ for i in $(MODULES_PATH); \
	do \
	make -C $$i; \
	done

	@ $(CXX) $^ -o [email protected] $(LIB_PATH) $(LIBS)
	@ echo Create $(TARGET) ok...

$(OBJS_CPP):%.o : %.cpp
	$(CXX) $(CFLAGS) $< -o [email protected] $(INC_PATH)

$(OBJS_CC):%.o : %.cc
	$(CXX) $(CFLAGS) $< -o [email protected] $(INC_PATH)

$(OBJS_C):%.o : %.c
	$(CXX) $(CFLAGS) $< -o [email protected] $(INC_PATH)

.PHONY : clean
clean:
	@ $(RM) $(TARGET) $(OBJS_CPP) $(OBJS_CC) $(OBJS_C)
	@ for i in $(MODULES_PATH); \
	do \
	make clean -C $$i; \
	done
	@echo clean all...



相關推薦

一點一點Makefile(6)-當前目錄原始檔及其子目錄原始檔

有時候,我們在開發的時候需要將本次工程的程式碼分成多個子目錄來編寫,但是在Makefile的編寫上卻是個問題,下面我就教大家怎麼構建帶有子資料夾的原始碼目錄的自動掃描編譯 下面這張圖是我的檔案樹 這裡面src目錄下是我的原始碼,我將功能程式碼分成了三個子模組,分別為tes

python當前目錄並刪除某文件

erl his odin drive 是否 pro 目錄 append pen #coding: utf-8 """ this programe is to clear driverlog below this dir __author__:the_new

nsis當前目錄

記錄 loop goto find detail clas rst end page demo.nsi Outfile "helloworld.exe" Section ;$0表示文件句柄, $1獲得的文件名 FindFirst $0 $1

當前目錄,提取指定資料夾內容並拷貝到指定位置

1、該指令碼為bat指令碼,在Windows下執行 2、指令碼遍歷當前目錄,包含子目錄,找到名稱為“應用程式”的資料夾 3、抽取資料夾的內容,包含子目錄,拷貝到“C:\GSPCloud_Beta管理\最新合併\應用程式” 4、詳細引數可以參考xcopy用法說明 @echo off &am

shell當前目錄的檔案,用去掉檔案字尾的字串替換檔案中的文字

今天寫了一個shell,遍歷當前目錄下的檔案,用每個檔案的檔名去掉字尾的字串替換檔案中的一段字串。  指令碼如下: #!/bin/bashfile=`ls *.html`;echo $filefor item in $filedo filename=${item

(python的坑,坑的我頭暈,下行迴圈後根)

總是提示越界錯誤 IndexError: list index out of range ### if s and s[-1].left == t: 需要先判斷s是否為空,假如:if s[-1].left == t and s就會出現越界。 ## 邊界條件的非常非常重要!!!! ##

跟我一起 Makefile - 6. 使用條件判斷

跟我一起寫 Makefile - 6. 使用條件判斷 http://wiki.ubuntu.org.cn 6. 使用條件判斷 使用條件判斷,可以讓 make 根據執行時的不同情況選擇不同的執行分支。條件表示式可以是比較變數的值,或是比較變數和常量的值。 6.1 示例 下面

一個能陣列和物件的通用的forEach函式

寫一個通用的函式,可以遍歷物件和陣列的通用函式 var obj = { x: 100, y: 200, z: 300 } var arr = [1, 2, 3, 4, 5, 6] function foreach(

利用UiAutomator一個自動渠道包關鍵功能的指令碼

本人在做自動化測試的過程中,出現了一個需求。原因是,在發出去的渠道包裡面,偶然一次有兩個渠道包微博登入失敗的bug,所以想著利用UiAutomator寫了一個自動遍歷每個渠道包的登入方式的指令碼。經過嘗試第一版終於完成,分享程式碼和思路,供大家參考。 思路:把所有渠道包放在

一份通用makefile,自動子目錄原始檔,自動生成依賴。

這份makefile可以將當前makefile所在資料夾以及所有子資料夾中的cpp檔案打包成靜態庫/動態庫/可執行檔案. 自動生成所有依賴關係,修改任何檔案都可以觸發重新編譯相應依賴的檔案。 在U

Java中如何利用File類遞歸的指定目錄中的所有文件和文件夾

generated class pan 目錄 遍歷 tabs () tab java package cuiyuee; import java.io.File; import java.util.ArrayList; import java.util.List; pu

java-IO流(File對象-深度指定目錄的文件夾和文件)

true file turn ren 文件夾 int tsa http absolut 需求:遍歷這個樹狀結構 File(String pathname) ‘\\‘為了轉義‘\‘ // 通過抽象路徑pathname 創建一個新的文件或者目錄 Fil

【圖的】廣度優先(DFS)、深度優先(BFS)及其應用

bsp 及其 spa (第五版 family 實驗 條件 soft 深度優先遍歷算法 無向圖滿足約束條件的路徑 • 目的:掌握深度優先遍歷算法在求解圖路徑搜索問題的應用 內容:編寫一個程序,設計相關算法,從無向圖G中找出滿足如下條件的所有路徑 (1)給定

perl 指定目錄的所有文件,替換指定文本內容,返回受影響的文件路徑

change argv 文件路徑 () 關鍵字 ror $nf pen elsif 不會讀取 影藏文件 main #!/usr/bin/perl my ($path, $rp) = @ARGV; sub search_file{ my ($fname, $rp

用shell腳本遞歸某個目錄的所有文件並移動到某個指定的目錄

腳本 遞歸遍歷 執行 val else valid RoCE elif ive 1,先看下腳本cat recursive.sh #!/bin/shread -p "input path:" FilePath function getAllfiles

易語言基礎——指定目錄的所有檔案(包含子目錄中的檔案)

1.實現效果: 尋找指定目錄下的檔案(包括子目錄中的檔案) 2.知識點: 尋找到的檔名 = 尋找檔案 (檔案目錄 + “\*.*”,1 + 2 + 4 + 16 + 32 ), *.*為正則表示式的寫法,*是萬用字元; 尋找到的檔名 = 尋找檔案 (, 1 + 2 + 4 + 16 + 32

PHP -- 目錄所有檔案,及演算法優化

在想解決這個問題的時候,我也查找了很多資料。推薦給大家我個人覺得比較好的一篇:PHP遍歷檔案目錄 文中第四個演算法可以遍歷出文件夾下的所有檔案,程式碼如下: $dir = 'E:\phpStudy\PHPTutorial\WWW'; echo '<pre>'; functio

Java指定目錄的所有檔案

初級Java面試經常會遇到寫一個遞迴遍歷指定資料夾下的所有檔案,今天閒來無事,看了些例子,自己整理一下。希望可以幫助到初學者,順便也算自己的一個筆記,方便以後查閱。 package files; import java.io.File; public class RecursionFi

Linux高階程式設計基礎——檔案系統程式設計之遞迴/home目錄

檔案系統程式設計之遞迴遍歷/home目錄 /編寫程式完成以下功能: 1.遞迴遍歷/home目錄,打印出所有檔案和子目錄名稱及節點號。 2.判斷檔案型別,如果是子目錄,繼續進行遞迴遍歷,直到遍歷完所有子目錄為止。/ #include <stdio.h> #include &

Java 某個目錄

import java.io.File; import java.io.IOException; public class DirErgodic { public static void find(String pathName) throws IOException{