簡體   English   中英

僅編譯linux終端中已編輯的文件

[英]Compiling only edited files in linux terminal

我在Linux操作系統中創建了一個包含大量.cpp.h文件的項目,問題是每次我想編譯和運行項目時我都要編譯所有內容,否則它不起作用。 例如:

g ++ main.cpp test.cpp test2.cpp test3.cpp test1.h test2.h test3.h -o main

有沒有辦法,當我只編輯main.cpp時,我不必重新編譯所有內容

g ++ main.cpp -o main

我建議使用makefile來完成這項工作,因為它們在構建依賴項方面非常出色。

https://www.cs.umd.edu/class/fall2002/cmsc214/Tutorial/makefile.html

如果main.cpp使用來自test * .cpp的代碼,則不能編譯main.cpp。 您可以使用g++ -c test.cpp將單個文件編譯為目標文件,然后使用g++ main.cpp test.o test2.o test3.o -o main鏈接這些文件。 如果您學習使用make ,則可以將此過程自動化為僅在需要時重新編譯目標文件。

您的頭文件通常應該是源文件中的#include d,因此您無需在命令行上顯式地提供它們。

增量編譯非常標准,是工程最佳實踐。 但是,要實現漸進式編譯(至少以理智且可持續的方式實際節省您的時間),您需要使用構建系統來跟蹤依賴關系並確定自上次調用之后哪些目標/輸入已更改構建系統,它可以自動調用編譯器來編譯和鏈接實際需要更新的目標。

對於構建系統的選擇,我建議研究Gradle (在開源項目中非常流行)或Bazel (谷歌的構建系統最近開源,雖然不太受歡迎)。 從歷史上看, Make (以及自動生成Makefile的系統,如AutoconfCMake )一直是常見的構建系統,特別是在C ++開發人員中; 然而,與更現代的構建系統相比,這些工具的普及程度越來越低,並且使得構建配置更加復雜,並且易於在腳下拍攝(例如,Gradle和Bazel構建了可跨系統移植的配置文件,而Makefile使得無意中依賴於特定於操作系統或特定於編譯器的細節使得構建過程變得不可移植相對容易.Make確實有一些非常便攜的規則來避免可移植性問題,但在設計makefile時必須非常小心以確保不使用非便攜式指令)。 有關更全面的C ++構建系統列表,請查看我的C ++資源頁面。

至於這些構建系統如何實現增量構建; 基本上,他們會將每個* .cpp文件分別編譯成自己的* .o文件,並保留* .o文件。 然后將每個* .o文件鏈接在一起以生成最終的構建輸出。 因此,只重新生成輸入比* .o文件更新的* .o文件; 類似地,只有那些* .o輸入比生成的庫或可執行文件更新的庫或可執行文件才會被重新創建。 簡而言之,這些構建系統將進行相當復雜的依賴性分析,以確定哪些文件已更改/要重建哪些目標,並將多次調用g ++(而不僅僅是一次)。 這就是為什么我強烈建議使用構建系統自動化它而不是嘗試手動執行它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM