CMake語法—調用順序(calling sequence)


CMake語法—調用順序(calling sequence)

1 示例代碼

代碼

2 代碼結構

目錄結構

  • 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:工程業務工具庫

3 代碼內容

  1. 工程主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")
    
  2. 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)
      
  3. 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)
      
  4. main.cpp

    int main()
    {
        return 0;
    }
    

4 運行結果

執行順序運行結果如下:

-- 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
請按任意鍵繼續. . .

5 總結

CMake配置項目時,會從主CMakeLists.txt開始配置(比如此示例中最外層的CMakeLists.txt)

接下來順序,會嚴格按主CMakeLists.txt的具體寫法(比如此示例中先添加libs子目錄,后添加tools子目錄,運行結果打印也是如此)

遇見add_subdirectory,就先對此子目錄先執行配置(比如此示例中在子目錄tools中,先添加toolC,后添加toolB,運行結果打印也是如此)

遵循此規律,以此類推,直至到配置完成。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM