」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 如何使用 GNU Make 建立具有相似規則的多個可執行檔?

如何使用 GNU Make 建立具有相似規則的多個可執行檔?

發佈於2024-11-07
瀏覽:771

 How to Build Multiple Executables with Similar Rules Using GNU Make?

使用GNU Make 建立具有類似規則的多個可執行檔

雖然Scons 是一個功能強大的建置工具,但實作所需的功能可能具有挑戰性。更直接的方法是利用 GNU Make,它可以輕鬆地從頂級和單一專案目錄進行建置和清理。

Makefile 設定

提供的 makefile啟用從 all_lessons 目錄和單一專案目錄進行建置和清理。每個項目的可執行檔均以其目錄命名。

專案結構

要實現此目的,您需要設定一個與提供的範例類似的專案結構:

all_lessons/
    helloworld/
        lesson.cpp
        main.cpp
    even_or_odd/
        lesson.cpp
        main.cpp
    calculator/
        lesson.cpp
        user_created_add.cpp
        main.cpp

Makefile 內容

project.mk

all :
% : forward_ # build any target by forwarding to the main makefile
    $(MAKE) -C .. project_dirs=$(notdir ${CURDIR}) $@
.PHONY : forward_

Makefile

# project configuration

project_dirs := $(shell find * -maxdepth 0 -type d )
exes := $(foreach dir,${project_dirs},${dir}/${dir})

all : ${exes}

# rules

.SECONDEXPANSION:
objects = $(patsubst %.cpp,%.o,$(wildcard $(dir ${1})*.cpp))

# link
${exes} : % : $$(call objects,$$*) Makefile
    g   -o $@ $(filter-out Makefile,$^) ${LDFLAGS} ${LDLIBS}

# compile .o and generate dependencies
%.o : %.cpp Makefile
    g   -c -o $@ -Wall -Wextra ${CPPFLAGS} ${CXXFLAGS} -MD -MP -MF ${@:.o=.d} $<

.PHONY: clean
clean :
    rm -f $(foreach exe,${exes},$(call objects,${exe})) $(foreach dir,${project_dirs},$(wildcard ${dir}/*.d)) ${exes}

# include dependency files
-include $(foreach dir,${project_dirs},$(wildcard ${dir}/*.d))

用法

從個人建置專案目錄

[project_directory]$ ln -s ../project.mk Makefile  # create a symlink
[project_directory]$ make

從頂級目錄建立

[all_lessons]$ make

清理各個專案目錄

[project_directory]$ cd ..
[all_lessons]$ make clean

清理所有項目

[all_lessons]$ make clean
最新教學 更多>
  • 如何使用 C++ 高效存取文字檔案中的特定行?
    如何使用 C++ 高效存取文字檔案中的特定行?
    在C 中取得文字檔案中的特定行在C 中,從文字檔案擷取特定行可以透過遍歷來實現文件。透過利用漏洞並迭代各行,您可以有效地找出所需位置。 為了示範這一點,請考慮以下程式碼片段:#include <fstream> #include <limits> std::fstream&a...
    程式設計 發佈於2024-11-20
  • 大批
    大批
    方法是可以在物件上呼叫的 fns 數組是對象,因此它們在 JS 中也有方法。 slice(begin):將陣列的一部分提取到新數組中,而不改變原始數組。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index ...
    程式設計 發佈於2024-11-20
  • 如何在 Pandas 中讀取沒有標題的 CSV 檔案中的特定欄位?
    如何在 Pandas 中讀取沒有標題的 CSV 檔案中的特定欄位?
    將表格資料​​讀入沒有標題的Pandas處理表格格式的資料(例如CSV 檔案)時,可能有必要在不存在標題的情況下讀取特定列。使用 Pandas(一個強大的用於資料操作的 Python 庫),可以透過使用選項組合來實現。 要從不帶標題的CSV 檔案中讀取列的子集,您可以使用read_csv() 函數以...
    程式設計 發佈於2024-11-20
  • Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta:列偏移的刪除和恢復Bootstrap 4 在其Beta 1 版本中引入了重大更改柱子偏移了。然而,隨著 Beta 2 的後續發布,這些變化已經逆轉。 從 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    程式設計 發佈於2024-11-20
  • 為什麼在 PHP 中回顯 MySQL 查詢會回傳「資源 id #6」而不是字串?
    為什麼在 PHP 中回顯 MySQL 查詢會回傳「資源 id #6」而不是字串?
    將MySQL 查詢結果回顯為字串在PHP 中,一個常見的任務是從MySQL 資料庫中檢索資料並將其顯示在Web 上頁。但是,當嘗試回顯 MySQL 查詢的結果時,您可能會遇到錯誤“Resource id #6”,而不是預期的字串。 了解資源 ID當使用 mysql_query() 等函數執行 MyS...
    程式設計 發佈於2024-11-20
  • 為什麼我的 Java Socket 用戶端收不到伺服器回覆?
    為什麼我的 Java Socket 用戶端收不到伺服器回覆?
    Java Socket: 處理無回應的伺服器回覆客戶端請求在所呈現的場景中,客戶端成功向伺服器發送字符串,提示伺服器進行處理和回應。然而,客戶端無法收到伺服器的回覆。 根本原因:問題源自於缺少新增行終止符(「\r\n」)寫入輸出流的字串結尾。這會阻礙客戶端和伺服器之間的通信,導致客戶端無法注意到伺服...
    程式設計 發佈於2024-11-20
  • 為什麼我在 C# 中遇到「無法連線到指定的 MySQL 主機」的問題?
    為什麼我在 C# 中遇到「無法連線到指定的 MySQL 主機」的問題?
    C# 中「無法連線到指定的MySQL 主機」錯誤的故障排除遇到錯誤「無法連線到任何指定的MySQL主機」時MySQL 主機」在C# 中執行MySQL連接程式碼時,檢查幾個方面至關重要:連接字串參數:如提供的答案所述,順序和連接字串內參數的間距可能很關鍵。 Pwd=myPassword;Server=...
    程式設計 發佈於2024-11-20
  • 儘管程式碼有效,為什麼 POST 請求無法擷取 PHP 中的輸入?
    儘管程式碼有效,為什麼 POST 請求無法擷取 PHP 中的輸入?
    解決PHP 中的POST 請求故障在提供的程式碼片段中:action=''而不是:action="<?php echo $_SERVER['PHP_SELF'];?>";?>"檢查$_POST數組:表單提交後使用var_dump檢查$_POST 陣列的內容。...
    程式設計 發佈於2024-11-20
  • 如何防止惡意 PHP 檔案上傳:綜合指南
    如何防止惡意 PHP 檔案上傳:綜合指南
    緩解惡意PHP 上傳:綜合指南為了解決某人透過線上表單上傳惡意PHP 檔案的問題,本文深入研究了PHP文件上傳領域以及與惡意內容相關的風險。 PHP 檔案上傳:超越圖像格式雖然最初的目的是僅上傳圖片,但問題是:如何防止惡意 PHP 檔案在壓縮資料夾中上傳?這種擔憂超出了圖像檔案類型的範圍,因為有人可...
    程式設計 發佈於2024-11-20
  • 在 Go 中使用 WebSocket 進行即時通信
    在 Go 中使用 WebSocket 進行即時通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要一种比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSoc...
    程式設計 發佈於2024-11-20
  • 如何使用 PHP 從 MySQL 資料庫動態產生 HTML 表?
    如何使用 PHP 從 MySQL 資料庫動態產生 HTML 表?
    使用MySQL 和PHP 動態創建HTML 表儘管有描述如何使用PHP 和MySQL 在HTML 中構建表的帖子,但之後頻繁更改MySQL 列標題創建表可能會很麻煩。本文探討了一種自動更新 PHP 程式碼的方法,讓您可以指定表格名稱並列印表格,而無需手動插入 標籤。 $table = "...
    程式設計 發佈於2024-11-20
  • 為什麼 Python 在 Windows 上不被辨識為指令?
    為什麼 Python 在 Windows 上不被辨識為指令?
    解決Windows 上的「Python:指令無法辨識」問題嘗試在Windows 中執行Python 指令時,使用者可能會遇到以下錯誤訊息「'python'未被識別為內部或外部命令。」出現此問題的原因是Python的可執行檔路徑未包含在系統PATH環境變數中。幸運的是,解決這個問題很簡...
    程式設計 發佈於2024-11-20
  • 如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    在 PHP 中組合關聯數組在 PHP 中,將兩個關聯數組組合成一個數組是常見任務。考慮以下請求:問題描述:提供的代碼定義了兩個關聯數組,$array1 和 $array2。目標是建立一個新陣列 $array3,它合併兩個陣列中的所有鍵值對。 此外,提供的陣列具有唯一的 ID,而名稱可能重疊。要求是建...
    程式設計 發佈於2024-11-20
  • 如何處理 Go 的 MGO DialWithTimeout() 失敗所引起的恐慌?
    如何處理 Go 的 MGO DialWithTimeout() 失敗所引起的恐慌?
    處理Go的MGO中的恐慌:DialWithTimeout()失敗考慮以下情況:您有一個使用mgo庫連接到MongoDB實例的Go函數。然而,您希望在不使程式崩潰的情況下處理 MongoDB 不可用的情況。 原始程式碼試圖透過使用延遲/恢復機制來實現這一點。然而,恐慌仍然導致程序退出。讓我們來探索一種...
    程式設計 發佈於2024-11-20
  • Eclipse Java 程式碼範本如何提高您的工作效率?
    Eclipse Java 程式碼範本如何提高您的工作效率?
    利用 Eclipse Java 程式碼範本來提高工作效率Eclipse 是著名的 Java 開發環境,它使開發人員能夠透過首選項視窗。使用者可以透過鍵盤快捷鍵啟動這些模板,從而簡化編碼流程並提高工作效率。 實務上有用的 Java 程式碼範本而 Eclipse提供了豐富的內建庫模板,開發人員分享了自訂...
    程式設計 發佈於2024-11-20

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3