」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 如何將多個 .cpp 檔案編譯並連結到單一二進位檔案?

如何將多個 .cpp 檔案編譯並連結到單一二進位檔案?

發佈於2024-11-11
瀏覽:899

How to Compile and Link Multiple .cpp Files into a Single Binary?

如何將多個.cpp檔編譯並連結為二進位

本文旨在解決將多個.cpp檔編譯為二進位文件的問題.o 物件並將它們連結到單一二進位檔案中。

Makefile配置

要實現此目的,可以使用包含以下內容的 Makefile:

SRC_DIR = ./src
OBJ_DIR = ./obj
SRC_FILES = $(wildcard $(SRC_DIR)/*.cpp)
OBJ_FILES = $(patsubst $(SRC_DIR)/%.cpp,$(OBJ_DIR)/%.o,$(SRC_FILES))

main.exe: $(OBJ_FILES)
    g   $(LDFLAGS) -o $@ $^

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp
    g   $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $<

解釋:

  • SRC_DIR: 指定包含包含源.cpp 的目錄files.
  • OBJ_DIR:表示將建立 .o 物件的目錄。
  • SRC_FILES:
  • SRC_FILES:
  • SRC_FILES:
  • SRC_FILES:
  • 中所有 .cpp 檔案的清單SRC_DIR.
  • OBJ_FILES:
  • 全部清單.o 將產生的物件。
  • main.exe:
  • 最終二進位檔案的名稱。
  • LDFLAGS:
  • 連結器標誌。

CPPFLAGS: C 預處理器flags.

CXXFLAGS:
CXXFLAGS  = -MMD
-include $(OBJ_FILES:.o=.d)

依賴關係圖產生

自動產生來源之間的依賴關係和目標文件,將以下內容新增至Makefile:

How to Compile and Link Multiple .cpp Files into a Single Binary? 
CXXFLAGS = -MMD -include $(OBJ_FILES:.o=.d)

最佳實踐

此方法通常用於編譯和連結多個 C 檔案。然而,有必要參考 GNU Make 手冊來獲取更多指導和進階選項。

最新教學 更多>
  • 為什麼 `std::atomic` 的儲存使用 XCHG 來實現 x86 上的順序一致性?
    為什麼 `std::atomic` 的儲存使用 XCHG 來實現 x86 上的順序一致性?
    為什麼std::atomic 的儲存採用XCHG 來實現順序一致性在x86 和x86_64 架構的std::atomic 上下文中,a具有​​順序一致性的儲存操作(std::memory_order_seq_cst) 使用XCHG而不是具有內存屏障的簡單存儲作為實現順序釋放語義的技術。 順序一致性和...
    程式設計 發佈於2024-11-18
  • 大批
    大批
    方法是可以在物件上呼叫的 fns 數組是對象,因此它們在 JS 中也有方法。 slice(begin):將陣列的一部分提取到新數組中,而不改變原始數組。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index ...
    程式設計 發佈於2024-11-18
  • 為什麼 C++ 不直接支援從函數傳回數組?
    為什麼 C++ 不直接支援從函數傳回數組?
    為什麼C 不贊成陣列返回函數C 景觀與Java 等語言相反,C 不支援陣列返回函數不為傳回數組的函數提供直接支援。雖然可以返回數組,但過程很麻煩。這引發了有關此設計決策背後的根本原因的問題。 C 中的陣列機制要理解這一點,我們必須深入研究 C 中陣列的基礎知識。 C,陣列名稱代表記憶體位址,而非陣列...
    程式設計 發佈於2024-11-18
  • 好的,以下是一些適合文章內容的標題:

* How to Fix the \"-lGL: not found\" Error in Qt
* Qt Compilation Error: \"-lGL: not found\" - What to Do
* Troubleshooting \"-lGL: not found\" Error in Qt Projects
* Resolving the
    好的,以下是一些適合文章內容的標題: * How to Fix the \"-lGL: not found\" Error in Qt * Qt Compilation Error: \"-lGL: not found\" - What to Do * Troubleshooting \"-lGL: not found\" Error in Qt Projects * Resolving the
    解決Qt 中的「-lGL:未找到」錯誤當嘗試在QtCreator 中編譯新建立的專案時,某些使用者可能會和遇到“-lGL:未找到”錯誤。出現此錯誤通常是因為未安裝必要的依賴項。 要解決此問題,請按照以下步驟操作: libgl1-mesa-dev: 該軟體包包含在 Qt 專案中支援 OpenGL 所需...
    程式設計 發佈於2024-11-18
  • PHP 的「eval」函數使用起來安全嗎?
    PHP 的「eval」函數使用起來安全嗎?
    什麼時候 eval 不是邪惡的? 雖然 PHP 的 eval 函數經常被勸阻,但它在 PHP 5.3 中的實用性值得商榷。儘管出現了LSB 和閉包,但以下是一些可以想像的用例,其中eval 可能仍然是首選:評估安全表達式:Eval 可用於評估數值或PHP 程式碼的其他特定子集,例如簡單的數學表達式,...
    程式設計 發佈於2024-11-18
  • 如何在 Go 中使用動態屬性解組 XML?
    如何在 Go 中使用動態屬性解組 XML?
    Golang:使用動態屬性解組XML簡介:在Go 中,encoding/xml提供了處理XML 資料的高效且通用的方法。然而,在處理具有動態屬性的 XML 元素時,由於存在未知數量和類型的屬性,解組變得具有挑戰性。 問題:如何使用以下方法解組 XML 標籤:當你沒有預料到會遇到的確切屬性時,如何在 ...
    程式設計 發佈於2024-11-18
  • 在 Go 中使用 WebSocket 進行即時通信
    在 Go 中使用 WebSocket 進行即時通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要一种比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSoc...
    程式設計 發佈於2024-11-18
  • C++中可以直接初始化類別資料成員嗎?
    C++中可以直接初始化類別資料成員嗎?
    類別資料成員可以直接初始化嗎? 在 C 中,類別資料成員不能使用直接初始化語法 () 來初始化,如下例所示:#include <iostream> class test { public: void fun() { int a(3); std::c...
    程式設計 發佈於2024-11-18
  • 為什麼 `std::cout
    為什麼 `std::cout
    f 的奇事;為什麼它總是在輸出中印出 1? 遇到一種特殊的行為,即調用不帶括號 (f;) 的函數並使用 std::cout 打印其結果始終產生數字 1 可能會引發問題。最初,人們可能會期望程式碼會列印一個函數指針,但觀察顯示並非如此。 深入研究下面的程式碼:#include <iostream...
    程式設計 發佈於2024-11-18
  • 為什麼我的 Font Awesome 圖示沒有顯示?
    為什麼我的 Font Awesome 圖示沒有顯示?
    Font Awesome 圖示顯示問題:解決方法Font Awesome 圖示顯示問題:解決方法如果您遇到Font Awesome 圖示未出現在您的網站上的問題,儘管包含必要的文件,請考慮以下故障排除提示:驗證CDN 連結:<link href="http://cdnjs.cl...
    程式設計 發佈於2024-11-18
  • 如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    在 PHP 中組合關聯數組在 PHP 中,將兩個關聯數組組合成一個數組是常見任務。考慮以下請求:問題描述:提供的代碼定義了兩個關聯數組,$array1 和 $array2。目標是建立一個新陣列 $array3,它合併兩個陣列中的所有鍵值對。 此外,提供的陣列具有唯一的 ID,而名稱可能重疊。要求是建...
    程式設計 發佈於2024-11-18
  • 如何從 JavaScript 點選事件呼叫 ASP.NET 方法?
    如何從 JavaScript 點選事件呼叫 ASP.NET 方法?
    從JavaScript 存取ASP.NET 函數要從JavaScript 的點選事件呼叫ASP.NET 方法,可以使用非標準方法:受僱。這裡有詳細的指南:使用IPostBackEventHandler 介面增強Page 類別:在您的ASP.NET 程式碼檔案中,使用以下程式碼繼承Page 類別: I...
    程式設計 發佈於2024-11-18
  • 您可以在 JavaScript 中的條件語句內宣告函數嗎?
    您可以在 JavaScript 中的條件語句內宣告函數嗎?
    條件語句中的函數宣告在 JavaScript 中,函數宣告具有不同的行為,取決於流行的語言標準及其執行環境。 嚴格模式 (ES5)嚴格模式,在 ECMAScript 5 中引入(ES5),條件語句中不允許使用函數宣告。這是因為函數宣告建立了提升變量,這些變數的作用域為整個函數或全域作用域。將它們放...
    程式設計 發佈於2024-11-18
  • 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-18
  • 複雜的查詢條件應該在資料映射器還是服務層處理?
    複雜的查詢條件應該在資料映射器還是服務層處理?
    如何處理複雜查詢條件:Data Mapper vs. Service Layer如何處理複雜查詢條件:Data Mapper vs. Service Layer在物件導向程式中處理複雜查詢條件時,主要有兩種方法:在資料映射器或服務層中處理它們。 資料映射器方法資料映射器模式用於將網域物件對應到和來自...
    程式設計 發佈於2024-11-18

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

Copyright© 2022 湘ICP备2022001581号-3