1. 程式人生 > >一個能自動搜尋原始檔並自動推導的Makefile

一個能自動搜尋原始檔並自動推導的Makefile

今天看了一天的makefile的寫法,東拼西湊,好不容易寫出了一個makefile,頗有成就感,記錄下來,以備溫習之用。

假設有兩個標頭檔案目錄 header1,header2;兩個cpp檔案目錄,src1,src2,一個lib目錄

寫一個完整的makefile步驟如下:

1 定義可執行檔案的名稱

 TARGET = Main

2 指定此編譯工程所要使用的標頭檔案所在的目錄

 INC = -Iheader1 -Iheader2

3 指定cpp檔案所在的目錄

 VPATH = .:src1:src2

4 指定所有的cpp檔案

   SRC_PATH = $(foreachdir,$(subst :, ,$(VPATH)),$(wildcard $(dir)/*.cpp))

解釋:

 foreach,subst,wildcard為makefile的內建函式,其中wildcard函式為字串連線函式,把函式中的兩個引數連線成一個subst是字串替換函式,在此句中意思是把VPATH變數中的冒號替換成空格。foreach函式,就是把subst函式的返回值,以空格為分隔符,迴圈取值賦給dir,然後接受wildcard處理

這句的總體意思是:從VPATH中獲取每個目錄,並分別找出此目錄下所有的cpp檔案,賦給SRC_PATH變數。

5 定義中間object檔案存放的目錄。

 OBJ_DIR = ./obj

6 所有的object檔案要按照和原始碼對應的目錄存放,定義object檔案的目錄

 OBJ_PATH = $(addprefix  $(OBJ_DIR)/,   $(subst :, ,$(VPATH) )  )

解釋:

 addprefix函式是加字首的函式,詞句中是給VPATH中所有已經定義的目錄加上./obj/的字首

7 定義連線成目標檔案所需要的所有的object檔案的名稱

 OBJS = $(addprefix $(OBJ_DIR),$(subst.cpp,.o,$(SRC_PATH)))

8 建立一個object檔案的目錄

 MAKE_OBJECT_DIR := $(shell mkdir -p$(OBJ_DIR) $(OBJ_PATH))

************************* 

9 定義實用的編譯器

 CXX = g++

 CXXFLAGS = -g

10 定義目標檔案的生成規則

 $(TARGET) : $(OBJS)

  $(CXX) -o [email protected] $(OBJS) $(INC)$(CXXFLAGS)

11 定義object檔案的生成方式:

 $(OBJ_DIR)/%.o : %.cpp %.cpp.d

  $(CXX) -o [email protected] -c $< $(INC) $(CXXFLAGS)

12 定義.cpp.d檔案的生成方式

 DEPS = $(OBJS:.o=.cpp.d)

 $(DEPS) : $(OBJ_DIR)/%.cpp.d : %.cpp

  $(CXX) $< -MM $(INC) >$(OBJ_DIR)/$<.d

13 定義清理函式

 clean:

    @rm -rf ./obj

    @rm -rf $(TARGET)

至此,一個通用的makefile完成了,如果增加原始碼目錄和標頭檔案目錄,只需要在INC變數和VPATH變數處加上此目錄即可。中間object檔案和檔案的依賴關係自動生成

相關推薦

一個自動搜尋原始檔自動推導Makefile

今天看了一天的makefile的寫法,東拼西湊,好不容易寫出了一個makefile,頗有成就感,記錄下來,以備溫習之用。 假設有兩個標頭檔案目錄 header1,header2;兩個cpp檔案目錄,src1,src2,一個lib目錄 寫一個完整的makefile步驟如下:

一個能夠自動匹配檔案編譯的makefile

AllDirs := $(shell ls -R | grep '^\./.*:$$' | awk '{gsub(":","");print}') . Sources := $(foreach n,$(AllDirs) , $(wildcard $(n)/*.cpp)) Objs := $(pats

shell監控網站是否自動運行自動重啟【原創】

自動重啟 aid func 服務腳本 date null com 監控網頁 moni shell監控網站是否自動運行並自動重啟 #!/bin/bash wget --spider -q -o /dev/null --tries=1 -T 5 www.baidu.co

mybatis 根據 資料庫表 自動生成 實體 自動生成中文註釋

原文地址:https://www.cnblogs.com/NieXiaoHui/p/6094144.html (將原文copy到此處,怕原作者刪除,順便記錄實際操作中我遇到的問題) 原文: 專案裡新建表時model,mapper以及mapper.xml基本都是用Myba

自動抓取解析一個商品頁

以美國adidas官網為例。 輸入url,抓取商品資訊(標題、描述、圖片等);抓取屬性資訊(顏色、尺碼、價格、庫存、skuId)。 思路很簡單,就是開啟頁面,分析各個需要內容的標籤。 獲取頁面 public static Document get

WPF彈出一個視窗,自動關閉

最近用WPF做了一個小的demo,由於對於WPF不是很熟悉,在這個過程中遇到不少問題,這篇文章便是針對某個小需求的整理,這個需求便是:在WPF中,如何彈出一個視窗,並讓它定時自動關閉。 我記得我最早的思路是在主視窗中開啟一個執行緒,這個執行緒每隔1s休眠一次,用這個執行緒來

通過node指令自動建立一個package.json檔案,封裝釋出使用

這一部分將通過node init指令來快速建立一個package.json檔案,大家可以清楚的看到如何自動建立一個包檔案,以便後續的使用。畢竟package.json檔案還是蠻大的,手動建立免不了多麻煩呢。 劃重點 使用命令 npm init 示例 如果需要

android 搜尋自動匹配關鍵字設定器顏色

SpannableString s = new SpannableString(item.getString); LogUtil.E("keyword:"+keyWord); Pattern p = Pattern.compil

XVideo 一個自動進行壓縮的小視訊錄製庫

XVideo 一個能自動進行壓縮的視訊錄製庫 關於我 特徵 支援自定義小視訊錄製時的視訊質量。 支援自定義視訊錄製的介面。 支援自定義最大錄製時長和最小錄製時長。 支援自定義屬性的視訊壓縮。 演示(請star支援)

自動搜尋不同位置的properties檔案載入

在專案開發中,對於一些程式執行的引數可能經常需要根據實際情況修改或調整,所以這些引數我們不會在程式碼中寫死,而是它們儲存在properties(或xml)檔案中,以方便修改。這時就需要智慧載入要配置檔案,如何智慧載入,我想要的載入順序: 1. jar包所在目錄(載入jar

C# 利用FTP自動下載xml文件後利用 FileSystemWatcher 監控目錄下文件變化自動更新數據庫

use img div 進行 ssa reg c# col without using FtpLib; using System; using System.Collections.Generic; using System.ComponentModel;

獲取bing圖片自動設置為電腦桌面背景(使用 URLDownloadToFile API函數)

href 一次 top tel tmp load 1.0 ace 國際 眾所周知,bing搜索網站首頁每日會更新一張圖片,張張漂亮(額,也有一些不合我口味的),特別適合用來做電腦壁紙。 我們想要將bing網站背景圖片設置為電腦桌面背景的通常做法是: 上網,搜索b

Swift - 判斷是否有某功能訪問權限,沒有則提示,自動跳轉到設置頁

權限 cells key 選擇 href ref options title kit 由於 iOS 系統的安全限制,App 如果需要訪問設備的通訊錄、麥克風、 相冊、 相機、地理位置等時,需要請求用戶是否允許訪問。 有時用戶不小心點了“不允許”,後面可能就不知道要去

Win10子系統開機啟動自動啟動ssh

win spa ans script.sh 興趣 log article windows 人的 首先在任意盤符下創建一個vbs腳本,文件名隨意,內容如下: Set ws = CreateObject("Wscript.Shell") ws.run "bash -c ‘sh

使用node自動刷房源發送可入住房源到郵箱

腳本 配置 href 天上 option save pass true html 因為住的地方離公司太遠,每天上下班都要坐很久的班車,所以最近想搬到公司旁邊的皖水公寓住。去問了一下公寓的客服,客服說房源現在沒有了,只能等到別人退房,才能在網站上申請到。 如果純靠手動F5刷

自動識別是手機訪問還是電腦訪問自動跳轉到相應版本

能判斷是電腦端還是手機端的javascript,自動跳轉到手機wap版網站:http://m.fjwd9.com/ 方法一: try { var urlhash = window.location.hash;

方案優化:網站實現掃描二維碼關註微信公眾號,自動登陸網站獲取其信息

用戶 class his onerror 就會 openid display 要點 rac 上一篇 《網站實現掃描二維碼關註微信公眾號,自動登陸網站並獲取其信息》 中已經實現用戶掃碼登陸網站並獲取其信息 但是上一篇方案中存在一個問題,也就是文章末尾指出的可以優化的地方(可

vs中添加工具cmder自動定位到當前目錄

png git ron 技術分享 分享 文件夾 命令行 body 目錄 有時在vs中為了使用git命令行,需要打開cmder工具,並讓cmder自切換到當前目錄: 方法1:         看下效果:       方法2:在文件夾中右鍵(添加到右

jenkins 自由風格構建war包,自動部署(jenkins和tomcat同一臺機器)

jenkins 自由風格 環境:centos7.3 ip:192.168.216.130 參考 http://www.cnblogs.com/h--d/p/5682030.html一 在正式構建之前需要先設置下jenkins1 點擊Manage Jenkins,然後點擊Global Tool

2、ROS實時檢測在線IP數自動對IP做限速

ROS1、將在線IP自動添加到地址列表2、實時檢測在線IP數3、自動對IP做限速實時檢測在線IP數:local s 0:foreach i in=[/ip firewall address-list find list=Online] do={:set s ($s+1)}:log warning ("