CMake之嵌套的CMakeLists

文章目錄

  • 前言
    • 項目結構
    • 節點關系
    • 如何嵌套多個cmake
    • 示例程序cmake
  • 總結


前言

在現代軟件開發中,CMake 是一個非常重要的工具,它允許開發者編寫可移植的構建腳本來管理項目。對于大型項目,通常會有多個模塊或子項目,這時候就需要用到嵌套的 CMakeLists 文件來組織代碼。本文將簡要介紹如何使用嵌套的 CMakeLists 來管理復雜的項目結構。


項目結構

.
├── build
│   ├── cJSON
│   ├── CMakeCache.txt
│   ├── CMakeFiles
│   ├── cmake_install.cmake
│   ├── log
│   ├── Makefile
│   └── test1
├── cJSON
│   ├── cJSON.c
│   └── CMakeLists.txt
├── CMakeLists.txt
├── include
│   ├── cJSON.h
│   └── log.h
├── log
│   ├── CMakeLists.txt
│   └── log.c
└── test1├── CMakeLists.txt└── main.c9 directories, 12 files

節點關系

眾所周知,Linux的目錄是樹狀結構,所以嵌套的 CMake 也是一個樹狀結構,最頂層的 CMakeLists.txt 是根節點,其次都是子節點。因此,我們需要了解一些關于 CMakeLists.txt 文件變量作用域的一些信息:

根節點CMakeLists.txt中的變量全局有效
父節點CMakeLists.txt中的變量可以在子節點中使用
子節點CMakeLists.txt中的變量只能在當前節點中使用

這三個概念是CMake中變量作用域的基本規則,可以這樣理解:

  • 根節點變量: 在最頂層的CMakeLists.txt文件中定義的變量,它們在整個項目中都是可見的。這意味著無論在項目的哪個位置,這些變量都可以被訪問和使用。

  • 父節點變量: 在某個目錄的CMakeLists.txt文件中定義的變量,它們可以被該目錄下的子目錄(即子節點)中的CMakeLists.txt文件使用。父節點變量對子節點來說是可見的,但不會影響到其他平行的目錄。

  • 子節點變量: 在子目錄的CMakeLists.txt文件中定義的變量,它們僅在當前子目錄的范圍內有效。這些變量對父目錄或其他目錄中的CMakeLists.txt文件是不可見的。

如何區分父子節點:
父節點:如果一個目錄包含其他的子目錄,并且這個目錄下有一個CMakeLists.txt文件,那么我們就稱這個目錄為"父節點"。父節點中定義的變量可以在其所有子節點中使用。

子節點:如果一個目錄位于另一個目錄下,并且這個目錄下也有一個CMakeLists.txt文件,那么我們就稱這個目錄為"子節點"。子節點可以使用其父節點中定義的變量,但是子節點中定義的變量只能在當前子節點中使用,對父節點或其他子節點不可見。

如何嵌套多個cmake

我們可以在每個小目錄下的CMakeLists.txt里面去生成動態/靜態庫,然后在你含main.c里面的CMakeLists.txt去鏈接他們,這樣就能實現對應的效果了。
那么,為什么不使用把源文件干過來呢?
這樣就失去了意義啊,CMakeLists.txt就毫無作用了

在根目錄中,我們可以使用add_subdirectory()這個去添加子目錄

示例程序cmake

根節點:
一般,我們在根節點可以直接把頭文件加入進去,就不用子節點去添加了

cmake_minimum_required(VERSION 3.2)
project(MyProject)# 添加頭文件路徑
include_directories(${PROJECT_SOURCE_DIR}/include)# 添加子目錄
add_subdirectory(cJSON)
add_subdirectory(log)
add_subdirectory(test1)

log目錄:

aux_source_directory(. DIR_LIB_SRCS)
add_library(log ${DIR_LIB_SRCS})

cJSON目錄:

aux_source_directory(. DIR_LIB_SRCS)
add_library(cJSON ${DIR_LIB_SRCS})

main目錄:

aux_source_directory(. DIR_SRCS)
add_executable(test1 ${DIR_SRCS})# 鏈接庫文件
target_link_libraries(test1 cJSON log)

總結

通過使用嵌套的 CMakeLists 文件,我們可以有效地管理大型項目中的多個子模塊。這種方法提供了清晰的模塊劃分,便于維護和擴展。雖然初學者可能會覺得有些復雜,但一旦掌握了基本概念和語法,就能夠利用 CMake 強大的功能來構建高效、可維護的構建系統。

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

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

相關文章

2024年618各城市跨境電商戰況如何?

2024年618各城市 跨境電商戰況如何? 2024 城市“618”跨境戰績(部分) 2024年“618”期間,全國跨境電商交易額實現2,397.12億元,同比增長8.68%。從跨境商品來看,進口端,嬰童食品、美容美妝、營養保健等商…

numpy.random.seed()使用

import numpy as npnp.random.seed(2) # 生成隨機種子2 一次使用機會 作用在下一個隨機數生成的時候 a np.random.random() # 使用隨機種子2 b np.random.random() # 因為隨機種子使用完了 ! 這里使用默認按系統根據時間作為seed參數的隨機種子 print(a) # 隨…

手機取證基礎知識(一)

文章關鍵詞:手機取證、電子數據取證 手機取證,也稱為移動設備取證或智能手機取證,是數字取證的一個分支,專注于從智能手機和其他移動設備中提取、分析和呈現證據的過程。這項技術通常用于法律調查,尤其是在犯罪調查中…

關于 AI 音樂大模型的研究報告

摘要:本研究報告聚焦于近期上線的音樂大模型,探討其對音樂創作門檻的降低影響,分析其引發的關于音樂圈是否會被 AI 徹底顛覆的討論,以及深入研究與之相關的版權歸屬和創意產業在 AI 影響下的發展等問題。 一、引言 在過去的一個月…

JavaScript(1)——JS介紹

JS是什么 是一種運行在客戶端(瀏覽器)的編程語言,實現人機交互的效果 作用(做什么) 網頁特效(監聽用戶的一些行為讓網頁做出對應的反饋)表單驗證(針對表單數據的合法性行為進行判…

PHP實戰:輕松實現商品庫存批量導入,高效管理不是夢!

在電商平臺上,批量導入商品庫存是一個常見的需求。通過批量導入,商家可以快速更新大量商品的庫存信息,提高工作效率。本文將介紹如何使用PHP編程語言實現這一功能,方便商家進行庫存管理。 首先,我們需要創建一個表格文…

[深度學習] 前饋神經網絡

前饋神經網絡(Feedforward Neural Network, FFNN)是人工神經網絡中最基本的類型,也是許多復雜神經網絡的基礎。它包括一個輸入層、一個或多個隱藏層和一個輸出層。以下是詳細介紹: 1. 結構 1. 輸入層(Input Layer&am…

【Android 構建新工具】Bazel 構建Android項目

【Android 構建新工具】Bazel 構建Android項目 本文我們使用Bazel構建一個最簡單的Android項目。Bazel提供了編譯Android程序內置的方法,具體參考:Android Rules 1. 環境準備 Bazel只是編譯工具,不是真正的編譯器,所以還是需要Andorid開發的SD、NDK以及Android Studio,…

基于改進天鷹優化算法(IAO)優化支持向量機(SVM)數據分類預測(IAO-SVM)

改進天鷹優化算法(IAO)見:【智能優化算法】改進的AO算法(IAO)-CSDN博客 支持向量機(SVM)數據分類預測:基于支持向量機(SVM)的數據分類預測-CSDN博客 代碼原理 基于改進天鷹優化算法(IAO)優化支持向量機(SVM&#xf…

uniapp獲取證書秘鑰、Android App備案獲取公鑰、簽名MD5值

一、 uniapp獲取證書秘鑰 打開uniapp開發者中心下載證書打開cmd輸入以下這段代碼,下載提供查看到的密鑰證書密碼就可以了!下載證書在 java 環境下運行才可以 // your_alias 換成 證書詳情中的別名,your_keystore.keystore 改成自己的證書文件…

Splashtop 的屏幕錄制功能如何提高 IT 合規性

在當今的數字時代,隨著遠程辦公的普及以及監管要求和網絡安全威脅的加劇,IT 副總裁、首席信息官(CIO)等 IT 管理人員面臨著一系列獨特挑戰。 各組織在遠程支持運營中要全力維護合規性、提高安全性并堅持問責制,技術解…

漢江師范學院2024年成人高等繼續教育招生簡章

漢江師范學院,這所承載著深厚文化底蘊和學術積淀的高等學府,即將在2024年迎來新一季的成人高等繼續教育招生。這不僅是一次知識的盛宴,更是對每一位懷揣夢想、追求進步的成年人的誠摯邀請。 漢江師范學院,以其嚴謹的教學態度、卓…

關于數據庫的ACID幾點

首先的話就是關于ACID,最重要的就是原子性了,這是基礎。 原子性是指事務包含的所有操作,要么全部完成,要么全部不完成。如果不能保證原子性,可能會出現以下問題: 數據不一致:事務中的部分操作…

AI基礎:從線性回歸到梯度下降

一個簡單的問題: 如果此時你正站在迷路繚繞的山坡上,能見度不高,但是你又想去往最低的山谷的位置,怎么走? 很簡單,哪里陡那就往那里走唄——而這就是梯度下降算法的思想。 古話說:“先發制于人…

java基于ssm+jsp 電子商城系統

1管理員功能模塊 管理員登錄,通過填寫用戶名、密碼進行登錄,如圖1所示。 圖1管理員登錄界面圖 管理員登錄進入電子商城系統可以查看個人中心、用戶管理、醫生管理、藥品信息管理、線上診療管理、醫生信息管理、管理員管理、論壇管理、系統管理、訂單管…

行業推薦!IG5216量產工具下載,IG5216開卡軟件分享

國內固態硬盤常用,且有量產工具流傳出來的主控廠商包括慧榮、群聯、點序、英韌、得一微、瑞昱、聯蕓、邁威、國科、華瀾微等等。 每個主控需要用各自對應的量產工具,不同的量產工具支持的閃存顆粒也有差異,因此要根據固態硬盤實際的主控型號…

氣膜建筑審批流程及現狀分析—輕空間

氣膜建筑作為一種新興的建筑形式,以其快速建造、成本低廉和靈活多變的優勢在各個領域得到了廣泛應用。然而,氣膜建筑在我國尚未被納入正式的建筑規范,這使得其審批流程與傳統建筑有顯著差異。輕空間將詳細探討氣膜建筑的審批流程及其在實際操…

深入探究 npm cache 命令:用途與實踐指南

npm(Node Package Manager)是 JavaScript 編程語言的包管理器,廣泛用于 Node.js 應用程序。它不僅用于管理項目中的依賴,還提供了一個強大的緩存機制來加速包的安裝過程。npm cache 命令是與 npm 緩存交互的命令行工具&#xff0c…

MongoDB:JSON and BSON

目錄 什么是 JSON MongoDB-JSON連接 什么是 BSON MongoDB 使用 BSON 還是 JSON JSON 與 BSON 架構靈活性和數據治理 JSON 和 BSON 是近親,正如它們幾乎相同的名稱所暗示的那樣JSON(即 JavaScript 對象表示法)是網絡上廣泛流行的數據交換…

grep使用

在 Windows 中,你可以使用以下步驟來使用 grep 命令: 安裝 Git for Windows:grep 命令通常在類 Unix 操作系統(如 Linux、Mac OS X 等)中使用,但你可以通過安裝 Git for Windows 來在 Windows 上獲得類似的…