目錄
- CMake文法—調用順序(calling sequence)
- 1 示例代碼
- 2 代碼結構
- 3 代碼内容
- 4 運作結果
- 5 總結
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5CN3QjMzIjNyMTMtYDN3QDM5IjNxQTMxAjMyAjMtETMxkDOz8CXxAjMyAjMvwVMxETO4MzLcd2bsJ2Lc12bj5ycn9Gbi52YuAjMwIzZtl2Lc9CX6MHc0RHaiojIsJye.png)
- learn_cmake:為根目錄
- CMakeLists.txt:CMake主腳本
- cmake_config.bat:執行CMake配置過程的腳本(輕按兩下直接運作)
@echo off set currentDir=%~dp0 set buildDir=%currentDir% set cmakeOutputDir=%currentDir%\build cmake -S %buildDir% -B %cmakeOutputDir% -G"Visual Studio 16 2019" -T v140 -A x64 pause
- src:工程源檔案目錄
- main.cpp:源檔案
- include:工程頭檔案目錄
- libs:工程業務子產品庫
- tools:工程業務工具庫
- 工程主CMakeLists.txt,即最外層的CMake腳本,也是CMake配置的入口
cmake_minimum_required(VERSION 3.18) # 設定工程名稱 set(PROJECT_NAME KAIZEN) # 設定工程版本号 set(PROJECT_VERSION "1.0.0.10" CACHE STRING "預設版本号") # 工程定義 project(${PROJECT_NAME} LANGUAGES CXX C VERSION ${PROJECT_VERSION} ) # 列印開始日志 message(STATUS "########## BEGIN_TEST") include(CMakePrintHelpers) set(prefix "call_stack_prefix") cmake_print_variables(prefix PROJECT_NAME) ## 一般會先編譯業務子產品庫 add_subdirectory(libs) ## 再編譯業務工具庫 add_subdirectory(tools) # 列印結束日志 message(STATUS "########## END_TEST\n")
- libs目錄下的主CMakeLists.txt,即libs目錄下最外層的CMake腳本,也是CMake配置在libs目錄的入口
cmake_minimum_required(VERSION 3.15) set(DIR_NAME libs) cmake_print_variables(prefix DIR_NAME) add_subdirectory(moduleA) add_subdirectory(moduleB) add_subdirectory(moduleC)
- libs下moduleA業務子產品目錄的CMakeLists.txt
cmake_minimum_required(VERSION 3.15) set(TARGET_NAME moduleA) cmake_print_variables(prefix TARGET_NAME)
- libs下moduleB業務子產品目錄的CMakeLists.txt
cmake_minimum_required(VERSION 3.15) set(TARGET_NAME moduleB) cmake_print_variables(prefix TARGET_NAME)
- libs下moduleC業務子產品目錄的CMakeLists.txt
cmake_minimum_required(VERSION 3.15) set(TARGET_NAME moduleC) cmake_print_variables(prefix TARGET_NAME)
- libs下moduleA業務子產品目錄的CMakeLists.txt
- tools目錄下的主CMakeLists.txt,即tools目錄下最外層的CMake腳本,也是CMake配置在tools目錄的入口
cmake_minimum_required(VERSION 3.15) set(DIR_NAME tools) cmake_print_variables(prefix DIR_NAME) add_subdirectory(toolA) add_subdirectory(toolC) add_subdirectory(toolB)
- tools下toolA工具目錄下的CMakeLists.txt
cmake_minimum_required(VERSION 3.15) set(TARGET_NAME toolA) cmake_print_variables(prefix TARGET_NAME)
- tools下toolB工具目錄下的CMakeLists.txt
cmake_minimum_required(VERSION 3.15) set(TARGET_NAME toolB) cmake_print_variables(prefix TARGET_NAME)
- tools下toolC工具目錄下的CMakeLists.txt
cmake_minimum_required(VERSION 3.15) set(TARGET_NAME toolC) cmake_print_variables(prefix TARGET_NAME)
- tools下toolA工具目錄下的CMakeLists.txt
- main.cpp
int main() { return 0; }
執行順序運作結果如下:
-- Selecting Windows SDK version 10.0.18362.0 to target Windows 10.0.17763.
-- The CXX compiler identification is MSVC 19.0.24245.0
-- The C compiler identification is MSVC 19.0.24245.0
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/amd64/cl.exe - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/amd64/cl.exe - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- ########## BEGIN_TEST
-- prefix="call_stack_prefix" ; PROJECT_NAME="KAIZEN"
-- prefix="call_stack_prefix" ; DIR_NAME="libs"
-- prefix="call_stack_prefix" ; TARGET_NAME="moduleA"
-- prefix="call_stack_prefix" ; TARGET_NAME="moduleB"
-- prefix="call_stack_prefix" ; TARGET_NAME="moduleC"
-- prefix="call_stack_prefix" ; DIR_NAME="tools"
-- prefix="call_stack_prefix" ; TARGET_NAME="toolA"
-- prefix="call_stack_prefix" ; TARGET_NAME="toolC"
-- prefix="call_stack_prefix" ; TARGET_NAME="toolB"
-- ########## END_TEST
-- Configuring done
-- Generating done
-- Build files have been written to: F:/learn_cmake/build
請按任意鍵繼續. . .
CMake配置項目時,會從主CMakeLists.txt開始配置(比如此示例中最外層的CMakeLists.txt)
接下來順序,會嚴格按主CMakeLists.txt的具體寫法(比如此示例中先添加libs子目錄,後添加tools子目錄,運作結果列印也是如此)
遇見add_subdirectory,就先對此子目錄先執行配置(比如此示例中在子目錄tools中,先添加toolC,後添加toolB,運作結果列印也是如此)
遵循此規律,以此類推,直至到配置完成。
作者:kaizen
出處:https://www.cnblogs.com/Braveliu/p/15802448.html
聲明:本文版權歸作者和部落格園共有,歡迎轉載。但未經作者同意必須保留此聲明,且在文章明顯位置給出本文連結,否則保留追究法律責任的權利。
簽名:順序 選擇 循環