文章目錄
- 前言
- 項目結構
- 節點關系
- 如何嵌套多個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 強大的功能來構建高效、可維護的構建系統。