日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
使用 CMake 和 VSCodium 設(shè)置一個(gè)構(gòu)建系統(tǒng)

提供一個(gè)適當(dāng)?shù)?CMake 配置文件來(lái)使其他人可以更容易地構(gòu)建、使用和貢獻(xiàn)你的項(xiàng)目。

專注于為中小企業(yè)提供成都網(wǎng)站制作、做網(wǎng)站、外貿(mào)營(yíng)銷網(wǎng)站建設(shè)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)高陵免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了上千多家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。

這篇文章是使用開(kāi)源 DevOps 工具進(jìn)行 C/C++ 開(kāi)發(fā)系列文章的一部分。如果你從一開(kāi)始就把你的項(xiàng)目建立在一個(gè)功能強(qiáng)大的工具鏈上,你的開(kāi)發(fā)會(huì)更快和更安全。除此之外,這會(huì)使別人更容易地參與你的項(xiàng)目。在這篇文章中,我將搭建一個(gè)基于 ??CMake?? 和 ??VSCodium?? 的 C/C++ 構(gòu)建系統(tǒng)。像往常一樣,相關(guān)的示例代碼可以在 ??GitHub?? 上找到。

我已經(jīng)測(cè)試了在本文中描述的步驟。這是一種適用于所有平臺(tái)的解決方案。

為什么用 CMake ?

??CMake?? 是一個(gè)構(gòu)建系統(tǒng)生成器,可以為你的項(xiàng)目創(chuàng)建 Makefile。乍一看簡(jiǎn)單的東西可能相當(dāng)?shù)貜?fù)雜。在較高的層次上,你可以定義你的項(xiàng)目的各個(gè)部分(可執(zhí)行文件、庫(kù))、編譯選項(xiàng)(C/C++ 標(biāo)準(zhǔn)、優(yōu)化、架構(gòu))、依賴關(guān)系項(xiàng)(頭文件、庫(kù)),和文件級(jí)的項(xiàng)目結(jié)構(gòu)。CMake 使用的這些信息可以在文件 ??CMakeLists.txt?? 中獲取,它使用一種特殊的描述性語(yǔ)言編寫(xiě)。當(dāng) CMake 處理這個(gè)文件時(shí),它將自動(dòng)地偵測(cè)在你的系統(tǒng)上已安裝的編譯器,并創(chuàng)建一個(gè)用于啟動(dòng)它的 Makefile 文件。

此外,在 ??CMakeLists.txt?? 中描述的配置,能夠被很多編輯器讀取,像 QtCreator、VSCodium/VSCode 或 Visual Studio 。

示例程序

我們的示例程序是一個(gè)簡(jiǎn)單的命令行工具:它接受一個(gè)整數(shù)來(lái)作為參數(shù),輸出一個(gè)從 1 到所提供輸入值的范圍內(nèi)的隨機(jī)排列的數(shù)字。

$ ./Producer 10
3 8 2 7 9 1 5 10 6 4

在我們的可執(zhí)行文件中的 ??main()?? 函數(shù),我們只處理輸入的參數(shù),如果沒(méi)有提供一個(gè)值(或者一個(gè)不能被處理的值)的話,就退出程序。

int main(int argc, char** argv){

if (argc != 2) {
std::cerr << "Enter the number of elements as argument" << std::endl;
return -1;
}

int range = 0;

try{
range = std::stoi(argv[1]);
}catch (const std::invalid_argument&){
std::cerr << "Error: Cannot parse \"" << argv[1] << "\" ";
return -1;
}

catch (const std::out_of_range&) {
std::cerr << "Error: " << argv[1] << " is out of range";
return -1;
}

if (range <= 0) {
std::cerr << "Error: Zero or negative number provided: " << argv[1];
return -1;
}

std::stringstream data;
std::cout << Generator::generate(data, range).rdbuf();
}

producer.cpp

實(shí)際的工作是在 ??生成器?? 中完成的,它將被編譯,并將作為一個(gè)靜態(tài)庫(kù)來(lái)鏈接到我們的??Producer?? 可執(zhí)行文件。

std::stringstream &Generator::generate(std::stringstream &stream, const int range) {
std::vector data(range);
std::iota(data.begin(), data.end(), 1);

std::random_device rd;
std::mt19937 g(rd());

std::shuffle(data.begin(), data.end(), g);

for (const auto n : data) {

stream << std::to_string(n) << " ";
}

return stream;
}

Generator.cpp

函數(shù) ??generate?? 引用一個(gè) ??std::stringstream?? 和一個(gè)整數(shù)來(lái)作為一個(gè)參數(shù)。根據(jù)整數(shù) ??range?? 的值 ??n??,制作一個(gè)在 ??1?? 到 ??n?? 的范圍之中的整數(shù)向量,并隨后打亂。接下來(lái)打亂的向量值轉(zhuǎn)換成一個(gè)字符串,并推送到 ??stringstream?? 之中。該函數(shù)返回與作為參數(shù)傳遞相同的 ??stringstream?? 引用。

頂層的 CMakeLists.txt

頂層的 ??CMakeLists.txt?? 的是我們項(xiàng)目的入口點(diǎn)。在子目錄中可能有多個(gè) ??CMakeLists.txt?? 文件(例如,與項(xiàng)目所相關(guān)聯(lián)的庫(kù)或其它可執(zhí)行文件)。我們先一步一步地瀏覽頂層的 ??CMakeLists.txt??。

第一行告訴我們處理文件所需要的 CMake 的版本、項(xiàng)目名稱及其版本,以及預(yù)定的 C++ 標(biāo)準(zhǔn)。

cmake_minimum_required(VERSION 3.14)

project(CPP_Testing_Sample VERSION 1.0)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED True)

我們用下面一行告訴 CMake 去查看子目錄 ??Generator??。這個(gè)子目錄包括構(gòu)建 ??Generator?? 庫(kù)的所有信息,并包含它自身的一個(gè) ??CMakeLists.txt?? 。我們很快就會(huì)談到這個(gè)問(wèn)題。

add_subdirectory(Generator)

現(xiàn)在,我們將涉及一個(gè)絕對(duì)特別的功能: ??CMake 模塊?? 。加載模塊可以擴(kuò)展 CMake 功能。在我們的項(xiàng)目中,我們加載了 ??FetchContent?? 模塊,這能使我們能夠在 CMake 運(yùn)行時(shí)下載外部的資源,在我們的示例中是 ??GoogleTest?? 。

include(FetchContent)

FetchContent_Declare(
googletest
URL https://github.com/google/googletest/archive/bb9216085fbbf193408653ced9e73c61e7766e80.zip
)
FetchContent_MakeAvailable(googletest)

在接下來(lái)的部分中,我們會(huì)做一些我們通常在普通的 Makefile 中會(huì)做的事: 指定要構(gòu)建的二進(jìn)制文件、它們相關(guān)的源文件、應(yīng)該鏈接的庫(kù),以及編譯器可以找到頭文件的目錄。

add_executable(Producer Producer.cpp)

target_link_libraries(Producer PUBLIC Generator)

target_include_directories(Producer PUBLIC "${PROJECT_BINARY_DIR}")

通過(guò)下面的語(yǔ)句,我們使 CMake 來(lái)在構(gòu)建文件夾中創(chuàng)建一個(gè)名稱為 ??compile_commands.json?? 的文件。這個(gè)文件會(huì)展示項(xiàng)目的每個(gè)文件的編譯器選項(xiàng)。在 VSCodium 中加載該文件,會(huì)告知 IntelliSense 功能在哪里查找頭文件(查看 ??文檔??)。

set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

最后的部分為我們的項(xiàng)目定義一些測(cè)試。項(xiàng)目使用先前加載的 GoogleTest 框架。單元測(cè)試的整個(gè)話題將會(huì)劃歸到另外一篇文章。

enable_testing()

add_executable(unit_test unit_test.cpp)

target_link_libraries(unit_test gtest_main)

include(GoogleTest)

gtest_discover_tests(unit_test)

庫(kù)層次的 CMakeLists.txt

現(xiàn)在,我們來(lái)看看包含同名庫(kù)的子目錄 ??Generator?? 中的 ??CMakeLists.txt?? 文件。這個(gè) ??CMakeLists.txt?? 文件的內(nèi)容更簡(jiǎn)短一些,除了單元測(cè)試相關(guān)的命令外,它僅包含 2 條語(yǔ)句。

add_library(Generator STATIC Generator.cpp Generator.h)
target_include_directories(Generator INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})

我們使用 ??add_library(...)?? 來(lái)定義一個(gè)新的構(gòu)建目標(biāo):靜態(tài)的 ??Generator?? 庫(kù)。我們使用語(yǔ)句 ??target_include_directories(...)?? 來(lái)把當(dāng)前子目錄添加到其它構(gòu)建目標(biāo)的頭文件的搜索路徑之中。我們也具體指定這個(gè)屬性的范圍為類型 ??INTERFACE??:這意味著該屬性僅影響鏈接到這個(gè)庫(kù)的構(gòu)建目標(biāo),而不是庫(kù)本身。

開(kāi)始使用 VSCodium

通過(guò)使用 ??CMakeLists.txt?? 文件中的信息,像 VSCodium 一樣的 IDE 可以相應(yīng)地配置構(gòu)建系統(tǒng)。如果你還沒(méi)有使用 VSCodium 或 VS Code 的經(jīng)驗(yàn),這個(gè)示例項(xiàng)目會(huì)是一個(gè)很好的起點(diǎn)。首先,轉(zhuǎn)到它們的 ??網(wǎng)站?? ,然后針對(duì)你的系統(tǒng)下載最新的安裝軟件包。打開(kāi) VSCodium 并導(dǎo)航到 “擴(kuò)展Extensions” 標(biāo)簽頁(yè)。

為了正確地構(gòu)建、調(diào)試和測(cè)試項(xiàng)目,搜索下面的擴(kuò)展并安裝它們:

Searching extensions

如果尚未完成,通過(guò)單擊起始頁(yè)的 “克隆 Git 存儲(chǔ)庫(kù)Clone Git Repository” 來(lái)克隆存儲(chǔ)庫(kù)。

Clone Git repository

或者手動(dòng)輸入:

git clone https://github.com/hANSIc99/cpp_testing_sample.git

之后,通過(guò)輸入如下內(nèi)容來(lái)簽出標(biāo)簽 ??devops_1??:

git checkout tags/devops_1

或者,通過(guò)單擊 “main” 分支按鈕(紅色框),并從下拉菜單(黃色框)中選擇標(biāo)簽。

Select devops_1 tag

在你打開(kāi) VSCodium 內(nèi)部中的存儲(chǔ)庫(kù)的根文件夾后,CMake Tools 擴(kuò)展會(huì)偵測(cè) ??CMakeLists.txt?? 文件并立即掃描你的系統(tǒng)尋找合適的編譯器。你現(xiàn)在可以單擊屏幕的底部的 “構(gòu)建Build” 按鈕(紅色框)來(lái)開(kāi)始構(gòu)建過(guò)程。你也可以通過(guò)單擊底部區(qū)域的按鈕(黃色框)標(biāo)記來(lái)更改編譯器,它顯示當(dāng)前活動(dòng)的編譯器。

Build compiler

要開(kāi)始調(diào)試 ??Producer?? 可執(zhí)行文件,單擊調(diào)試器符號(hào)(黃色框)并從下拉菜單中選擇 “調(diào)試Debug Producer”(綠色框)。

Starting the debugger

如上所述,??Producer?? 可執(zhí)行文件要求將元素的數(shù)量作為一個(gè)命令行的參數(shù)。命令行參數(shù)可以在 ??.vscode/launch.json?? 中具體指定。

Command-line arguments

好了,你現(xiàn)在能夠構(gòu)建和調(diào)試項(xiàng)目了。

結(jié)束語(yǔ)

歸功于 CMake ,不管你正在運(yùn)行哪種操作系統(tǒng),上述步驟應(yīng)該都能工作。特別是使用與 CMake 相關(guān)的擴(kuò)展,VSCodium 變成了一個(gè)強(qiáng)大的 IDE 。我沒(méi)有提及 VSCodium 的 Git 集成,是因?yàn)槟阋呀?jīng)能夠在網(wǎng)絡(luò)上查找很多的資源。我希望你可以看到:提供一個(gè)適當(dāng)?shù)?CMake 配置文件可以使其他人更容易地構(gòu)建、使用和貢獻(xiàn)于你的項(xiàng)目。在未來(lái)的文章中,我將介紹單元測(cè)試和 CMake 的測(cè)試實(shí)用程序 ??ctest?? 。


名稱欄目:使用 CMake 和 VSCodium 設(shè)置一個(gè)構(gòu)建系統(tǒng)
文章出自:http://m.5511xx.com/article/cddejsh.html