2-添加庫

??? 本節將學習如何在項目中創建和使用庫,還將看到如何使庫的使用成為可選的。

??? 本節中使用的示例代碼下載見step1-簡單開始cmake實踐-CSDN博客。

練習1 -創建一個庫

??? 要在CMake中添加一個庫,使用add_library()命令并指定哪些源文件應該組成該庫。
??? 我們可以使用一個或多個子目錄組織項目,而不是將所有源文件放在一個目錄中。在本例中,我們將專門為庫創建一個子目錄。在這里,我們可以添加一個新的CMakeLists.txt文件和一個或多個源文件。在頂級的CMakeLists.txt文件中,我們將使用add_subdirectory()命令將子目錄添加到構建中。
??? 創建庫之后,使用target_include_directories()和target_link_libraries()將其連接到可執行目標。

目標

??? 添加并使用庫。

開始

??? 在本練習中,我們將在項目中添加一個庫,其中包含我們自己的用于計算數字平方根的實現。然后,可執行文件可以使用這個庫,而不采用編譯器提供的標準平方根函數。
??? 在本教程中,我們將把庫放入名為MathFunctions的子目錄中。這個目錄已經包含了頭文件MathFunctions.h和mysqrt.h。還提供了它們各自的源文件MathFunctions.cxx和mysqrt.cxx。我們不需要修改這些文件。mysqrt.cxx有一個名為mysqrt的函數,它提供了與編譯器的SQRT函數類似的功能。MathFunctions.cxx包含一個函數SQRT,用于隱藏我們自己寫的SQRT函數的實現細節。
???? 從在本文提供的代碼實例文件夾下/Step2目錄中,從TODO 1開始,完成TODO 6。
??? 首先,在MathFunctions子目錄中填寫一行CMakeLists.txt。
??? 接下來,編輯頂層的CMakeLists.txt。
??? 最后,使用tutorial.cxx中新創建的MathFunctions庫。

操作

??? 在MathFunctions目錄下的CMakeLists.txt文件中,我們使用add_library()創建了一個名為MathFunctions的庫目標。庫的源文件作為參數傳遞給add_library()。這看起來像下面這行:

// TODO 1: MathFunctions/CMakeLists.txt
add_library(MathFunctions MathFunctions.cxx mysqrt.cxx)

??? 為了使用新庫,我們將在頂級CMakeLists.txt文件中添加add_subdirectory()調用,以便庫將被構建。

// TODO 2: CMakeLists.txt
add_subdirectory(MathFunctions)

??? 接下來,使用target_link_libraries()將新的庫目標鏈接到可執行目標。

// TODO 3: CMakeLists.txttarget_link_libraries(Tutorial PUBLIC MathFunctions)

??? 最后,我們需要指定庫的頭文件位置。修改現有的target_include_directories()調用,將MathFunctions子目錄添加為包含目錄,這樣就可以找到MathFunctions.h頭文件。

// TODO 4: CMakeLists.txt
target_include_directories(Tutorial PUBLIC"${PROJECT_BINARY_DIR}""${PROJECT_SOURCE_DIR}/MathFunctions")

??? 現在讓我們使用庫。在tutorial.cxx中包含MathFunctions.h:

// TODO 5: tutorial.cxx#include "MathFunctions.h"

??? 最后,用包裝函數mathfunctions::sqrt替換sqrt。

// TODO 6: tutorial.cxxconst double outputValue = mathfunctions::sqrt(inputValue);

編譯和運行

mkdir Step2_build
cd Step2_build
cmake ../Step2
cmake --build .

??? 嘗試使用編譯好的項目,并確保它仍然產生準確的平方根值。

./Tutorial 4294967296
./Tutorial 10
./Tutorial

練習2 -添加選項

??? 現在讓我們在MathFunctions庫中添加一個選項,允許開發人員選擇自定義的平方根實現或內置的標準實現。
??? CMake可以使用option()命令執行此操作。這為用戶提供了一個可以在配置cmake構建時更改的變量。

目標

??? 添加不使用MathFunctions函數的編譯選項。

步驟

???? 首先使用MathFunctions/CMakeLists.txt中的option()命令創建一個變量USE_MYMATH。在同一個文件中,使用該選項將編譯定義傳遞給MathFunctions庫。
??? 然后,更新MathFunctions,基于USE_MYMATH重定向編譯。
??? 最后,當USE_MYMATH打開時,通過在MathFunctions/CMakeLists.txt的USE_MYMATH塊中使其成為自己的庫。

操作

??? 第一步是在MathFunctions/CMakeLists.txt中添加一個選項,默認值為ON,可由用戶更改。

// TODO 7: MathFunctions/CMakeLists.txt
option(USE_MYMATH "Use tutorial provided math implementation" ON)

??? 接下來,使用這個新選項使庫與mysqrt函數的構建和鏈接成為有條件的選項。
??? 創建一個if()語句來檢查USE_MYMATH的值。在if()塊中,放入target_compile_definitions()命令和編譯定義USE_MYMATH。

// TODO 8: MathFunctions/CMakeLists.txt
if (USE_MYMATH)target_compile_definitions(MathFunctions PRIVATE "USE_MYMATH")
endif()

條件判斷

  • if (USE_MYMATH)
    

    這里使用了 CMake 的 if 命令來判斷變量 USE_MYMATH 是否為真(即非空或者非零)。如果 USE_MYMATH 被定義為 ONTRUE、非空字符串或者被設置為一個非零數值,條件判斷將會成立。

  • 目標編譯定義

  1. target_compile_definitions(MathFunctions PRIVATE "USE_MYMATH")
    

    如果 USE_MYMATH 的條件成立,那么就會為目標 MathFunctions 添加一個編譯定義。在這里,編譯定義是 "USE_MYMATH"。這意味著在編譯 MathFunctions 庫或可執行文件時,會將 "USE_MYMATH" 添加到編譯器的預處理器定義中。

  2. PRIVATE 關鍵字PRIVATE 關鍵字指定了這個編譯定義的作用域。在 CMake 中,PRIVATE 表示這個定義只會影響到 MathFunctions 目標本身及其直接依賴的其他目標。這意味著其他使用 MathFunctions 的目標或庫不會自動繼承 "USE_MYMATH" 這個定義,除非它們也顯式地聲明。

??? 這段代碼的作用是根據 USE_MYMATH 變量的值來決定是否為 MathFunctions 添加一個編譯定義 "USE_MYMATH"。這樣的做法通常用于根據不同的構建選項或條件,啟用或禁用特定的功能或代碼路徑。

??? 當USE_MYMATH為ON時,編譯定義USE_MYMATH將被設置。然后,我們可以使用這個編譯定義來啟用或禁用源代碼的部分。
??? 接下來在MathFunctions.cxx文件中,我們讓USE_MYMATH控制使用哪個平方根函數:

#ifdef USE_MYMATHreturn detail::mysqrt(x);
#elsereturn std::sqrt(x);
#endif

??? 接下來,如果定義了USE_MYMATH,我們需要包含mysqrt.h。

// TODO 10: MathFunctions/MathFunctions.cxx#ifdef USE_MYMATH
#  include "mysqrt.h"
#endif

??? 最后,在使用std::sqrt時,我們需要包含cmath。

// TODO 11 : MathFunctions/MathFunctions.cxx#include <cmath>

??? 此時,如果USE_MYMATH為OFF, mysqrt.cxx不會被使用,但它仍然會被編譯,因為MathFunctions目標有mysqrt.cxx列在來源下面。
??? 有幾種方法可以解決這個問題。第一個選項是使用target_sources()來添加mysqrt.cxx從USE_MYMATH塊中取出。另一個選擇是在USE_MYMATH塊中創建一個額外的庫,它負責編譯mysqrt.cxx。在本教程中,我們將創建一個額外的庫。
??? 首先,在USE_MYMATH中創建一個名為SqrtLibrary的庫,其源代碼為mysqrt.cxx。

// TODO 12 : MathFunctions/CMakeLists.txtadd_library(SqrtLibrary STATICmysqrt.cxx)# TODO 6: Link SqrtLibrary to tutorial_compiler_flagstarget_link_libraries(MathFunctions PRIVATE SqrtLibrary)
endif()

??? 接下來,當啟用USE_MYMATH時,我們將SqrtLibrary鏈接到MathFunctions。

// TODO 13 : MathFunctions/CMakeLists.txttarget_link_libraries(MathFunctions PRIVATE SqrtLibrary)

??? 最后,我們可以從MathFunctions庫源列表中刪除mysqrt.cxxcxx,因為它將在包含SqrtLibrary時被拉入。

// TODO 14 : MathFunctions/CMakeLists.txtadd_library(MathFunctions MathFunctions.cxx)

??? 通過這些更改,mysqrt函數現在對于正在構建和使用MathFunctions庫的人來說完全是可選的。用戶可以切換USE_MYMATH來操作編譯中使用的庫。

編譯并運行

??? 由于我們已經在練習1中配置了編譯目錄,我們可以通過簡單地調用以下命令進行編譯:

cd ../Step2_build
cmake --build .

??? 現在讓我們將USE_MYMATH的值更新為OFF。

cmake ../Step2 -DUSE_MYMATH=OFF

??? 現在,用下面的代碼重新編譯代碼:

cmake --build .

??? 然后,再次運行可執行文件,以確保它在USE_MYMATH設置為OFF時仍然工作。

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

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

相關文章

接入應用內支付服務,提高商業變現效率

在當今競爭激烈的移動應用市場中&#xff0c;開發者們面臨著提升應用商業變現能力的挑戰。用戶體驗的流暢性和支付的安全性至關重要。 HarmonyOS SDK應用內支付服務&#xff08;IAP Kit&#xff09;為開發者提供了一站式的解決方案&#xff0c;簡化了應用內支付的接入流程&…

C嘎嘎:類和對象(一)

目錄 面向過程和面向對象的初步認識 類的引入 類的定義 類的訪問限定符及封裝 訪問限定符 封裝 類的作用域 類的實例化 類對象模型 如何計算類對象大小 結構體內存對齊規則 this指針 this指針的引出 this指針的特性 類的6個默認成員函數 構造函數 概念 特性 …

喜訊丨美格智能通過國際EcoVadis平臺認證企業社會責任并榮獲承諾獎章,彰顯可持續發展實力

作為全球領先的無線通信模組及解決方案提供商&#xff0c;美格智能在社會責任領域再創新高。近日&#xff0c;美格智能憑借在企業社會責任和可持續性采購發展方面的卓越表現&#xff0c;通過國際在線權威評價機構EcoVadis對公司環境、勞工與人權、商業道德、可持續采購等方面審…

根據空格、制表符、回車符等分割字符串re.split

【小白從小學Python、C、Java】 【考研初試復試畢業設計】 【Python基礎AI數據分析】 根據空格、制表符、 回車符等分割字符串 re.split [太陽]選擇題 根據給定的Python代碼&#xff0c;哪個選項是正確的&#xff1f; import re pattern r\s print(f"【顯示】pattern{…

高清圖片壓縮無水印小程序源碼系統 前后端分離 帶完整的安裝代碼包以及搭建教程

系統概述 在當今的數字化時代&#xff0c;圖片作為信息傳播的重要載體&#xff0c;其質量和傳輸效率直接影響到用戶體驗。然而&#xff0c;高清圖片往往伴隨著較大的文件體積&#xff0c;這不僅會占用大量存儲空間&#xff0c;還會拖慢網頁或應用的加載速度。因此&#xff0c;…

熱烈祝賀!全視通多家客戶上榜全球自然指數TOP100!

2024年6月18日&#xff0c;全球醫療機構自然指數TOP100榜單發布&#xff0c;中國醫療機構在其中的表現尤為引人注目。 根據《自然》雜志網站發布的數據&#xff0c;此次公布的排名是基于&#xff08;2023年3月1日至2024年2月29日&#xff09;的統計數據&#xff0c;全球醫療機構…

Python在網絡爬蟲和數據抓取中的應用

Python在網絡爬蟲和數據抓取中的應用 引言 在數字化時代&#xff0c;數據的價值日益凸顯。無論是市場趨勢分析&#xff0c;還是個人偏好預測&#xff0c;數據都扮演著至關重要的角色。Python&#xff0c;作為一種功能強大、語法簡潔的編程語言&#xff0c;為數據的獲取、處理…

旗晟機器人AI智能算法有哪些?

在當今迅猛發展的工業4.0時代&#xff0c;智能制造和自動化運維已然成為工業發展至關重要的核心驅動力。伴隨技術的持續進步&#xff0c;工業場景中的運維巡檢已不再單純地依賴于傳統的人工運維方式&#xff0c;而是愈發多地融入了智能化的元素&#xff0c;其中智能巡檢運維系統…

前端Din字體和造字工房力黑字體文件

Din 字體是一種經典的、簡潔的無襯線字體&#xff0c;它源自1930年代的德國交通標志設計。 造字工房力黑字體適用于數字&#xff0c;駕駛艙標題等統計界面 DIN-Medium.otf 案例 造字工房力黑.TTF 案例

記錄一次MySql鎖等待 (Lock wait timeout exceeded)異常

[TOC](記錄一次MySql鎖等待 (Lock wait timeout exceeded)異常) Java執行一個SQL查詢未提交&#xff0c;遇到1205錯誤。 java.lang.Exception: ### Error updating database. Cause: java.sql.SQLException: Lock wait timeout exceeded; try restarting transactionCluster…

動手學深度學習6.2 圖像卷積-筆記練習(PyTorch)

以下內容為結合李沐老師的課程和教材補充的學習筆記&#xff0c;以及對課后練習的一些思考&#xff0c;自留回顧&#xff0c;也供同學之人交流參考。 本節課程地址&#xff1a;卷積層_嗶哩嗶哩_bilibili 代碼_嗶哩嗶哩_bilibili 本節教材地址&#xff1a;6.2. 圖像卷積 — 動…

Python使用watchdog庫實現監控文件系統的更改

1. 先下載對應庫&#xff1a; pip install watchdog import time from watchdog.observers import Observer from watchdog.events import FileSystemEventHandlerclass FileChangeHandler(FileSystemEventHandler):def on_modified(self, event):# 當文件被修改時觸發此方法…

淺析Nginx技術:開源高性能Web服務器與反向代理

什么是Nginx&#xff1f; Nginx是一款輕量級、高性能的HTTP和反向代理服務器&#xff0c;也可以用作郵件代理服務器。它最初由俄羅斯的程序員Igor Sysoev在2004年開發&#xff0c;并于2004年首次公開發布。Nginx的主要優勢在于其非阻塞的事件驅動架構&#xff0c;能夠處理大量并…

Vue3使用ref綁定組件獲取valueRef.value為null的解決

問題&#xff1a; onMounted(() > {nextTick(()>{console.log(treeselectRef, treeselectRef.value);console.log(treeselectRef.value, treeselectRef.value);}); });輸出&#xff1a; 查看綁定和定義都沒有問題&#xff0c;還是獲取不到 解決&#xff1a;使用getCur…

數據結構第17節 最小堆

最小堆&#xff08;Min Heap&#xff09;是一種特殊的完全二叉樹數據結構&#xff0c;在這種結構中&#xff0c;對于任意節點&#xff0c;其值都小于或等于它的子節點的值。根節點是堆中的最小元素。最小堆常用于實現優先隊列&#xff0c;以及堆排序算法。 在Java中&#xff0…

14-55 劍和詩人29 - RoSA:一種新的 PEFT 方法

介紹 參數高效微調 (PEFT) 方法已成為 NLP 領域研究的熱門領域。隨著語言模型不斷擴展到前所未有的規模&#xff0c;在下游任務中微調所有參數的成本變得非常高昂。PEFT 方法通過將微調限制在一小部分參數上來提供解決方案&#xff0c;從而以極低的計算成本在自然語言理解任務上…

深度學習(筆記內容)

1.國內鏡像網站 pip使用清華源鏡像源 pip install <庫> -i https://pypi.tuna.tsinghua.edu.cn/simple/ pip使用豆瓣的鏡像源 pip install <庫> -i https://pypi.douban.com/simple/ pip使用中國科技大學的鏡像源 pip install <庫> -i https://pypi.mirro…

vite工程化開發配置---持續更新

vite支持tsx開發 根據之前寫的文章vue3vitetseslintprettierstylelinthuskylint-stagedcommitlintcommitizencz-git里面tsconfig配置了jsx相關選項&#xff0c;但是想要vite能夠識別我們還需要配置一下 安裝vitejs/plugin-vue-jsx pnpm i -D vitejs/plugin-vue-jsxvite.confi…

Scapy庫實現SYN洪水攻擊的Python腳本

Scapy庫實現SYN洪水攻擊的Python腳本 代碼用于學習熟悉Scapy庫及其在網絡安全研究和測試中提供的各種選項和功能 腳本旨在執行SYN洪水攻擊,這是一種分布式拒絕服務(DDoS)攻擊的類型。未經授權參與此類攻擊通常是違法的,可能會產生嚴重后果 代碼 SynFlood.py from scapy.all…

Google 搜索引擎:便捷高效、精準查詢,帶來無與倫比的搜索體驗

Google搜索引擎不僅具備檢索功能&#xff0c;實則是引領探索萬千世界的神秘鑰匙。試想&#xff0c;無論何時何地&#xff0c;只需輕觸屏幕&#xff0c;所需信息即可唾手可得。便捷與高效&#xff0c;令人嘆為觀止。其界面設計簡約直觀&#xff0c;操控體驗猶如與未來對話&#…