目錄
CMake語法—打印幫助(CMakePrintHelpers)
1 CMakePrintHelpers
1.1 cmake_print_variable
1.1.1 定義
cmake_print_variables(var1 var2 .. varN)
1.1.2 說明
打印每個變量值
1.2 cmake_print_properties
1.2.1 定義
cmake_print_properties([TARGETS target1 .. targetN]
[SOURCES source1 .. sourceN]
[DIRECTORIES dir1 .. dirN]
[TESTS test1 .. testN]
[CACHE_ENTRIES entry1 .. entryN]
PROPERTIES prop1 .. propN )
1.2.2 說明
打印屬性值。支持TARGETS、SOURCES、DIRECTORIES、TESTS、CACHE_ENTRIES的屬性打印
特別注意:PROPERTIES關鍵字不能丟
2 應用示例
2.1 代碼結構

-
learn_cmake:為根目錄
-
build:為CMake配置輸出目錄(在此例中即生成sln解決方案的地方)
-
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:源文件
2.2 代碼內容
-
CMakeLists.txt
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) # 1.cmake_print_variables ## 1.1 打印CMAKE內置變量 cmake_print_variables(CMAKE_VERSION) cmake_print_variables(CMAKE_GENERATOR) ## 若采用MSVC構建,可直接使用CMAKE_VS_PLATFORM_NAME if (MSVC) cmake_print_variables(CMAKE_VS_PLATFORM_NAME) endif() ## 1.2 打印普通變量 cmake_print_variables(PROJECT_NAME) cmake_print_variables(${PROJECT_NAME}) # 若采用Ninja構建,沒有CMAKE_VS_PLATFORM_NAME,可通過CMAKE_SIZEOF_VOID_P變通處理 if (CMAKE_SIZEOF_VOID_P EQUAL 8) set(${PROJECT_NAME}_PLATFORM_NAME "x64") else() set(${PROJECT_NAME}_PLATFORM_NAME "Win32") endif() cmake_print_variables(${PROJECT_NAME}_PLATFORM_NAME) ## 1.3 打印緩存變量 cmake_print_variables(PROJECT_VERSION) ## 1.4 同時打印多個變量 set(var_1 "var1") set(var_2 "var2") cmake_print_variables(var_1 var_2) # 2.cmake_print_properties ## 2.1 打印屬性 set(TARGET_NAME component) set(${TARGET_NAME}_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) # 提取所有源文件(include和src分開提取) file(GLOB_RECURSE ${TARGET_NAME}_HEADER_FILES LIST_DIRECTORIES False CONFIGURE_DEPENDS "${${TARGET_NAME}_SOURCE_DIR}/include/*.h*" ) file(GLOB_RECURSE ${TARGET_NAME}_SRC_FILES LIST_DIRECTORIES False CONFIGURE_DEPENDS "${${TARGET_NAME}_SOURCE_DIR}/src/*.h*" "${${TARGET_NAME}_SOURCE_DIR}/src/*.c*" ) # 為VS設置源代碼文件夾 source_group( TREE "${${TARGET_NAME}_SOURCE_DIR}/include" PREFIX "Header Files" FILES ${${TARGET_NAME}_HEADER_FILES} ) source_group( TREE "${${TARGET_NAME}_SOURCE_DIR}/src/" PREFIX "Source Files" FILES ${${TARGET_NAME}_SRC_FILES} ) # 添加target add_library(${TARGET_NAME} SHARED) # 指定源文件 target_sources(${TARGET_NAME} PRIVATE ${${TARGET_NAME}_SRC_FILES} PRIVATE ${${TARGET_NAME}_HEADER_FILES} ) # 設置target屬性 set_target_properties(${TARGET_NAME} PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS True ##自動導出符號 FOLDER "libs" ##設置VS路徑 ) cmake_print_properties(TARGETS ${TARGET_NAME} PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS FOLDER) # 打印結束日志 message(STATUS "########## END_TEST\n") -
main.cpp
int main() { return 0; }簡單示例,此文件僅僅為了創建Target的完整性。
2.3 輸出結果
-
運行結果
-- 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 -- CMAKE_VERSION="3.18.2" -- CMAKE_GENERATOR="Visual Studio 16 2019" -- CMAKE_VS_PLATFORM_NAME="x64" -- PROJECT_NAME="KAIZEN" -- KAIZEN="" -- KAIZEN_PLATFORM_NAME="x64" -- PROJECT_VERSION="1.0.0.10" -- var_1="var1" ; var_2="var2" -- Properties for TARGET component: component.WINDOWS_EXPORT_ALL_SYMBOLS = "True" component.FOLDER = "libs" -- ########## END_TEST -- Configuring done -- Generating done -- Build files have been written to: F:/learn_cmake/build 請按任意鍵繼續. . .
2.4 注意事項
2.4.1 使用前必須引入CMakePrintHelpers
使用兩者前提必須引入CMakePrintHelpers,詳見示例CMakeLists.txt代碼第18行。
2.4.2 打印屬性
本示例僅提供了TARGETS的屬性打印,也是最常用之一。其余支持的屬性,后期使用到會穿插在示例中演示。
特殊說明:示例CMakeLists.txt代碼第53行~93行即定義一個Target對象的常規必備項內容,后期會專門分析TARGET內容。
在此只要記住,target必須是由add_executable或者add_library(如示例CMakeLists.txt中第81行)生成即可。
