VS Code使用 CMake 或 Makefile管理C++多文件編譯

VS Code使用 CMake 或 Makefile管理C++多文件編譯

  • 一、Cmake方式
    • 1、文件結構
    • 2、構建項目
  • 二、Makefile方式
    • 1、文件結構
    • 2、Makefile
    • 3、構建項目
  • 三、附件
    • 示例中使用到的文件及代碼

使用 CMake 或 Makefile 是更加標準和靈活的方法來管理多文件編譯。以下是一個簡單的示例,展示了如何使用 CMake 來構建包含多個源文件的 C++ 項目。
【注】在我測試C++靜態全局對象初始化的過程中,由于使用g++后面跟需要編譯的文件名太過于麻煩,特整理下CMake的管理多文件編譯的方法。(靜態全局對象初始化順序是未定義,測試的過程中發現和g++后面的文件間順序有關,CMake也是一樣的,感興趣的可以自己測測,我使用的linux + VS Code + Cmake, windows的可以自己配置環境,windows + VS Code + mingw + CMame)

一、Cmake方式

1、文件結構

假設我們有以下文件結構:

project_folder
│ CMakeLists.txt
│ main.cpp
│ common.h
│ file.cpp
│ file1.cpp
│ file2.cpp

CMakeLists.txt

cmake_minimum_required(VERSION 3.0)
project(MyProject)# 添加可執行文件, 下面的文件順序會導致我定義的全局靜態變量的初始化順序也不一致
add_executable(myProgram mian.cpp file.cpp file2.cpp file1.cpp  common.h)

2、構建項目

安裝 CMake(如果尚未安裝)。
在項目文件夾中創建一個名為 build 的子文件夾,用于構建項目。
在 build 文件夾中打開終端,運行以下命令:

cmake …

這將根據 CMakeLists.txt 創建構建文件。
運行以下命令進行編譯:

make

這將使用構建文件編譯項目,并生成名為 myProgram 的可執行文件。

這些命令將在終端中執行。一旦編譯完成,你可以在終端中運行 ./myProgram 來執行你的程序。
使用 CMake 有助于管理更復雜的項目結構,并能夠輕松添加其他依賴項、調整編譯選項以及添加測試等功能。 Makefile 也是一種相似的方法,它可以用于管理代碼的編譯和鏈接過程

二、Makefile方式

下面是一個簡單的 Makefile 示例,用于構建包含多個源文件的 C++ 項目。在這個示例中,我們有 main.cpp、 file.cpp、file2.cpp、file1.cpp 四個源文件和一個common.h頭文件。我們將使用 Makefile 來編譯這些源文件并生成可執行文件。

1、文件結構

假設我們有以下文件結構:

project_folder
│ Makefile
│ main.cpp
│ common.h
│ file.cpp
│ file1.cpp
│ file2.cpp

2、Makefile

把下面內容寫到文件結構中的Makefile文件中。(在 Makefile 中,通常不需要顯式引入頭文件(.h 文件),我在這里引入頭文件)

我們創建了一個名為 HEADERS 的變量來存儲頭文件的名稱。然后,我們在生成目標文件的規則中使用 $(HEADERS) 來指示每個 .o 目標都依賴于指定的頭文件。這樣可以確保在每次頭文件發生變化時,相關的源文件將被重新編譯。
這種方法使得 Makefile 更加清晰和易于維護,因為頭文件的依賴關系被單獨定義在一個地方,便于統一管理。

# Makefile
# 編譯器
CXX = g++
# 編譯選項
CXXFLAGS = -std=c++11 -Wall# 目標文件
TARGET = myProgram
# 源文件
SRCS = main.cpp file.cpp file2.cpp file1.cpp# 目標文件
OBJS = $(SRCS:.cpp=.o)# 頭文件
HEADERS = common.h# 默認目標
all: $(TARGET)# 生成可執行文件
$(TARGET): $(OBJS)$(CXX) $(CXXFLAGS) -o $@ $^# 生成目標文件
%.o: %.cpp $(HEADERS)$(CXX) $(CXXFLAGS) -c $<# 清理生成的文件
clean:rm -f $(OBJS) $(TARGET)

3、構建項目

在項目文件夾中打開終端,運行以下命令:
運行 make 來編譯項目并生成可執行文件。(在Makefile的同級目錄下執行下面命令)

make

然后運行 ./myProgram 來執行你的程序。

./myProgram

通過這種方式,Makefile 負責管理源文件的編譯、鏈接和生成可執行文件的過程。你可以根據需要對 Makefile 進行調整,以滿足項目的具體需求。

三、附件

大體內容就這些,下面是我測試時的示例代碼。如有疑問,歡迎一起討論。

示例中使用到的文件及代碼

// main.cpp
#include"common.h"int main()
{std::cout << "hello world." << std::endl;test_classA();test_classB();test_classC();return 0;}
// common.h
#include<iostream>
class classA;
class classB;
class classC;void test_classA();
void test_classB();
void test_classC();
// file.cpp
#include"common.h"#include"common.h"class classC
{
private:int x;
public:classC(/* args */);~classC();void print() {std::cout << __FUNCTION__ << "(), " << __FILE__<< ", x = " << x << std::endl;  }
};classC::classC(/* args */)
{std::cout << __FUNCTION__ << "(), " __FILE__ << std::endl;  
}classC::~classC()
{std::cout << __FUNCTION__ << "(), " __FILE__ << std::endl;  
}static classC objC;
void test_classC()
{objC.print();
}
// file1.cpp
#include"common.h"class classA
{
private:int x;
public:classA(/* args */);~classA();void print() {std::cout << __FUNCTION__ << "(), " << __FILE__<< ", x = " << x << std::endl;  }
};classA::classA(/* args */)
{std::cout << __FUNCTION__ << "(), " __FILE__ << std::endl;  
}classA::~classA()
{std::cout << __FUNCTION__ << "(), " __FILE__ << std::endl;  
}static classA objA;
void test_classA()
{objA.print();
}
// file2.cpp
#include"common.h"class classB
{
private:int m;
public:classB(/* args */);~classB();void print() {std::cout << __FUNCTION__ << "(), " << __FILE__<< ", m = " << m << std::endl;  }
};classB::classB(/* args */)
{std::cout << __FUNCTION__ << "(), " __FILE__ << std::endl;  
}classB::~classB()
{std::cout << __FUNCTION__ << "(), " __FILE__ << std::endl;  
}static classB objB;
void test_classB()
{objB.print();
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/214337.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/214337.shtml
英文地址,請注明出處:http://en.pswp.cn/news/214337.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

80個常用shell命令及簡單用法

Shell命令是Linux和Unix系統中的基礎&#xff0c;用于完成各種操作&#xff0c;如文件管理、程序執行、文本處理等。下面列舉一些常用的Shell命令&#xff0c;并詳細解釋它們的功能及應用場景&#xff1a; ls - 列出目錄內容 功能&#xff1a;列出指定目錄中的文件和目錄。應用…

智能優化算法應用:基于郊狼算法3D無線傳感器網絡(WSN)覆蓋優化 - 附代碼

智能優化算法應用&#xff1a;基于郊狼算法3D無線傳感器網絡(WSN)覆蓋優化 - 附代碼 文章目錄 智能優化算法應用&#xff1a;基于郊狼算法3D無線傳感器網絡(WSN)覆蓋優化 - 附代碼1.無線傳感網絡節點模型2.覆蓋數學模型及分析3.郊狼算法4.實驗參數設定5.算法結果6.參考文獻7.MA…

Mybatis增刪改查基礎

MyBatis可根據查詢的結果類型、查詢條件的不同進行統一處理。 1 查詢數據 1.1 根據查詢數據條數來分析不同的情況 1.1.1 查詢單條數據 可以通過實體類、list集合、map等處理查詢結果。 通過實體類查詢單條數據 User queryUserById(Param("id") Integer id);<…

C、C++、C#的區別概述

C、C、C#的區別概述 https://link.zhihu.com/?targethttps%3A//csharp-station.com/understanding-the-differences-between-c-c-and-c/文章翻譯源于此鏈接 01、C語言 ? Dennis Ritchie在1972年創造了C語言并在1978年公布。Ritchie設計C的初衷是用于開發新版本的Unix。在那之…

express框架使用

一、express介紹 express 是一個基于 Node.js 平臺的極簡、靈活的 WEB 應用開發框架&#xff0c;簡單來說&#xff0c;express 是一個封裝好的工具包&#xff0c;封裝了很多功能&#xff0c;便于我們開發 WEB 應用&#xff08;HTTP 服務&#xff09; 二、express 使用 2.1 e…

【組合數學】遞推關系

目錄 1. 遞推關系建立2. 常系數齊次遞推關系的求解3. 常系數非齊次遞推關系的求解4. 迭代法 1. 遞推關系建立 給定一個數的序列 f ( 0 ) , f ( 1 ) , . . . , f ( n ) , . . . , f (0), f(1), ..., f(n ),... , f(0),f(1),...,f(n),..., 若存在整數 n 0 n_0 n0? &#xff…

datav-實現輪播表,使用updateRows方法-無縫銜接加載數據

前言 最近在做大屏需求的時候&#xff0c;遇到一個輪播數據的需求&#xff0c;查看datav文檔發現確實有這個組件 但這個組件只提供了一次加載輪播的例子&#xff0c;雖然提供了輪播加載數據updateRows方法 但是文檔并沒有觸發事件&#xff0c;比如輪播完數據觸發事件&#xf…

ESL電子標簽的真相:電子墨水屏沒墨水?

一說到電子墨水屏 你大概率會想到Kindle 如果你問是不是墨水做的 那這篇文章你就得好好看看了 在我們日常與客戶的溝通中 為數不多卻出乎意料地有好幾個以下對話↓ 在此辟謠 電子墨水屏里確實 沒 有 墨 水 那它是什么樣的原理&#xff1f;為什么越來越多顯示設備采用&…

Abp vNext在Docker部署并導出鏡像

Docker介紹 Docker 是一個開源的應用容器引擎&#xff0c;讓開發者可以打包他們的應用以及依賴包到一個可移植的鏡像中&#xff0c;然后發布到任何流行的 Linux或Windows操作系統的機器上&#xff0c;也可以實現虛擬化。容器是完全使用沙箱機制&#xff0c;相互之間不會有任何…

深度剖析中國居民消費價格指數CPI數據可視化案例-Python可視化技術實現(附完整源碼)【數據可視化項目案例-16】

?????? 你的技術旅程將在這里啟航! ???? 本專欄包括所有的可視化技術學習,感興趣可以到本專欄頁面,查閱可視化寶典可快速了解本專欄。訂閱專欄用戶可以在每篇文章底部下載對應案例源碼以供大家深入的學習研究。 ?? 每一個案例都會提供完整代碼和詳細的講解,不論…

Win11在Virtualbox上安裝ubuntu操作系統

注&#xff1a;原創筆記&#xff0c;以下圖片水印為本人 相關工具展示 第四個&#xff1a;ubuntu的vmdk文件&#xff0c;用于配置虛擬機 第5/6個&#xff1a;virtualbox安裝包 一、安裝 VirtualBox 由于win11版本問題&#xff0c;如果裝不了 virtualBox需要在官網安裝最新版…

新零售模式:跨境電商如何實現線上線下融合?

隨著數字時代的發展&#xff0c;新零售模式逐漸嶄露頭角&#xff0c;成為跨境電商發展的重要趨勢。線上線下融合不僅拓寬了銷售渠道&#xff0c;更提供了更豐富、更便捷的購物體驗。 本文將深入探討新零售模式在跨境電商中的應用&#xff0c;以及如何實現線上線下融合&#xf…

前后端請求之nginx配置

問題&#xff1a; 前端發送的請求&#xff0c;是如何請求到后端服務器的&#xff1f; 如&#xff0c;前端請求地址&#xff1a;http://loclhost/api/employee/login&#xff1a; 后端相應請求地址&#xff1a;http://loclhost:8080/admin/employee/login 回答&#xff1a; …

使用MfgTool燒寫前需準備的文件

一. 簡介 本文我們就來學習&#xff0c;如何將我們編譯的 uboot&#xff0c;zImage&#xff08;內核鏡像&#xff09;&#xff0c;xxx.dtb設備樹文件&#xff0c;還有制作的根文件系統&#xff0c;這四個文件燒寫到開發板中&#xff0c;最后 開發板能正常啟動。 本文這里使用…

【日志技術】附Logback入門教程

文章目錄 日志概論日志的體系Logback快速入門日志配置文件配置日志級別 日志概論 什么是日志&#xff1f;其實可以通過下面幾個問題來了解的。 系統系統能記住某些數據被誰操作&#xff0c;比如被誰刪除了&#xff1f;想分析用戶瀏覽系統的具體情況&#xff0c;比如挖掘用戶的…

一個簡單的Python自動化測試 logging 日志模塊,為何會難住一個工作6年的測試?

寫Python程序的時候&#xff0c; 我們經常需要寫日志&#xff0c; 以便調試程序&#xff0c;發現問題&#xff0c;以及查看程序的運行狀態。 Python自帶了logging模塊&#xff0c;可以將日志保存到.txt文件中&#xff0c; 也可以輸入到界面上。 我們希望日志有一定的格式, 比…

【性能優化】性能優化實戰

一、背景 在做code review的時候&#xff0c;經常會發現&#xff0c;因為開發習慣問題&#xff0c;很多研發人員喜歡在for循環中查詢數據庫。今天用一個真實例子&#xff0c;記錄一次查詢性能優化的例子 二、示例 代碼如下: classmethod fn_performance() def get_task_ins…

Linux常用調試工具gdb

程序編譯后&#xff0c;調試是十分重要的環節&#xff0c;如何更好更快的定位程序中的問題&#xff0c; 是加快程序開發進度的重要因素。Gdb 調試器是一款 GNU 開發組織并發布的 UNIX/Linux 下的程序調試工 具。GDB調試 編譯要點 對代碼進行編譯&#xff0c;注意一定要加上選項…

【C語言】【數據結構】自定義類型:結構體

引言 這是一篇對結構體的詳細介紹&#xff0c;這篇文章對結構體聲明、結構體的自引用、結構體的初始化、結構體的內存分布和對齊規則、庫函數offsetof、以及進行內存對齊的原因、如何修改默認對齊數、結構體傳參進行介紹和說明。 ? 豬巴戒&#xff1a;個人主頁? 所屬專欄&am…

Ubuntu——永久掛載/卸載硬盤

Ubuntu——永久掛載/卸載硬盤 一、掛載1. 查詢硬盤2. 格式化硬盤3. 掛載硬盤4. 開機自動掛載5. 查看掛載是否成功 二、取消掛載參考資料&#xff1a; 一、掛載 1. 查詢硬盤 sudo fdisk -l2. 格式化硬盤 # 格式化硬盤(/dev/sda)的文件系統&#xff0c;這里格式化為 ext4 系統…