cmake命令使用总结

-->.命令:cmake_minimum_required(VERSION 3.10)
描述:请求cmake的版本,一般在cmake文件的开头


-->.命令:project(Tutorial VERSION 1.3)
描述:指定工程名称为Tutorial,并且生成变量PROJECT_NAME为Tutorial,Tutorial_VERSION_MAJOR为1,Tutorial_VERSION_MINOR为3.


-->.命令:configure_file(TutorialConfig.h.in TutorialConfig.h)
描述:根据配置文件TutorialConfig.h.in的信息生成头文件TutorialConfig.h,这样程序源代码可以通过包含TutorialConfig.h头文件获取cmake工程里面的配置信息。例:
TutorialConfig.h.in:
// the configured options and settings for Tutorial
#define Tutorial_VERSION_MAJOR @Tutorial_VERSION_MAJOR@
#define Tutorial_VERSION_MINOR @Tutorial_VERSION_MINOR@
如果命令project指定的版本为1.3,则生成的头文件为:
TutorialConfig.h:
#define Tutorial_VERSION_MAJOR 1
#define Tutorial_VERSION_MINOR 3


-->.命令:target_include_directories
使用:target_include_directories(Tutorial PUBLIC "${PROJECT_BINARY_DIR}")
描述:为工程指定头文件包含目录,PROJECT_BINARY_DIR变量指定为对应的路径,该命令必须在add_executable命令之后


-->.命令:target_link_directories
使用:target_link_directories(${PROJECT_NAME} PUBLIC ${CMAKE_LIBRARY_OUTPUT_DIRECTORY} "/opt/X11/lib")
描述:为工程指定链接库包含目录,该命令必须在add_executable命令之后


-->.命令:target_link_libraries(Tutorial PUBLIC MathFunctions)
描述:生成Tutorial目标时,链接MathFunctions库文件

使用:
target_link_libraries(${PROJECT_NAME} PRIVATE
  Qt5::Core
  "-framework OpenGL"
  "-framework Cocoa" 
  "-framework QtWidgets"
)
描述:指定工程链接的库文件.


-->.命令:target_compile_options.
使用:
if(${CMAKE_BUILD_TYPE} STREQUAL Debug)
target_compile_options(${PROJECT_NAME} PRIVATE -O0)
else()
target_compile_options(${PROJECT_NAME} PRIVATE -O2)
endif()
描述:CMAKE_BUILD_TYPE为外部定义的变量,外部指定了编译为debug还是release

使用2:
target_compile_options(${PROJECT_NAME} PRIVATE
  -std=c++11
  -stdlib=libc++
  -ObjC++
  -fobjc-arc
)
描述:设置一些编译选项。


-->.命令:target_link_options.
使用:target_link_options(${PROJECT_NAME} PRIVATE  -Wl,-rpath,$ORIGIN)
描述:设置指定的链接选项。


-->.命令:set_target_properties
使用:
add_executable(my_program main.cpp)
set_target_properties(my_program PROPERTIES
    RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
描述:可执行文件 my_program 将被输出到构建目录下的 bin 子目录中。

使用:
add_library(my_library SHARED src/my_library.cpp)
set_target_properties(my_library PROPERTIES
    LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
描述:库文件my_library 将被输出到构建目录下的 lib 子目录中。

使用:
add_executable(my_program main.cpp)
set_target_properties(my_program PROPERTIES
    CXX_STANDARD 17
    CXX_STANDARD_REQUIRED ON)
描述:我们首先使用 add_executable 命令添加了一个可执行目标 my_program。
然后,我们使用 set_target_properties 命令设置了 my_program 的两个属性:我们设置 CXX_STANDARD 属性为 17,意味着我们想要使用 C++17 标准;
我们设置 CXX_STANDARD_REQUIRED 属性为 ON,意味着我们要求编译器必须支持 C++17 标准,否则 CMake 配置过程会失败。

使用:
set_target_properties (${PROJECT_NAME} PROPERTIES OUTPUT_NAME ${PROJECT_NAME})
描述:设置生成可执行文件名称。

使用:
set_target_properties(${TARGET} PROPERTIES VS_PLATFORM_TOOLSET v142)
set_target_properties(${TARGET} PROPERTIES
    WIN32_EXECUTABLE YES
    LINK_FLAGS "/ENTRY:mainCRTStartup"
)


-->.命令:include_directories.
使用:
set(QT_INCLUDE "/opt/homebrew/Cellar/qt@5/5.15.8_3/include")
set(QT_GUI_INCLUDE "/opt/homebrew/Cellar/qt@5/5.15.8_3/lib/QtGui.framework/Versions/5/Headers/5.15.8/QtGui")
include_directories(${QT_INCLUDE} ${QT_GUI_INCLUDE})
描述:设置头文件包含路径,这个对全局作用域有效,target_include_directories只对指定工程有效.


-->.命令:link_directories.
使用:
set(QT_FRAMEWORKS "/opt/homebrew/Cellar/qt@5/5.15.8_3/lib")
link_directories(${QT_FRAMEWORKS})
描述:设置库文件包含路径,这个对全局作用域有效,target_link_directories只对指定工程有效.


-->.命令:add_compile_options。
使用:
add_compile_options(-Wall -O2)
描述:设置编译选项,这个对全局作用域有效,target_compile_options只对指定的工程有效。


-->.命令:add_link_options
使用:
add_link_options(/SUBSYSTEM:WINDOWS)
add_link_options(/SUBSYSTEM:CONSOLE)
add_link_options(/ENTRY:WinMainCRTStartup)
描述:用于为整个项目添加全局链接选项。这些选项将被用在所有目标的链接阶段,适用于那些需要对整个项目的所有可执行文件和库应用相同链接行为的情况。
对于具体目标的链接选项,推荐使用 target_link_options。这个命令提供了更精细的控制,能够为特定的可执行文件或库设置链接选项。


-->.命令:add_definitions
使用:
add_definitions(-Ddefinition)
add_definitions(-DUNICODE -D_UNICODE)
描述:用于向项目中添加编译器定义,即预处理器指令。这些定义会应用到当前目录及其子目录下的所有目标(可执行文件和库)上。
这使得可以方便地为整个项目或特定部分添加编译时定义,例如开启或关闭特定的功能或调试支持。
对于现代 CMake,更推荐使用 target_compile_definitions,这样可以针对特定的目标(库或可执行文件)添加定义,而不是全局地影响所有目标。


-->.命令:add_subdirectory(MathFunctions)
描述:跳转去执行对应MathFunctions子目录下的CMakeLists.txt文件


-->.命令:add_executable(Tutorial tutorial.cxx)
描述:指定工程编译的源文件,以及对应的可执行文件


-->.命令:add_library(MathFunctions STATIC  mysqrt.cxx)
描述:根据指定的c++文件生成对应的静态库

使用:add_library(${PROJECT_NAME} SHARED ${ALL_FILES})
描述:根据指定的c++文件生成对应的动态库


-->.命令:find_package 
描述: 用于加载和使用 CMake 找到的外部项目(即,库)。
当 find_package 用于查找一个项目时,它会尝试找到并加载这个项目的 CMake 配置文件,或者使用模块模式来查找这个项目。
通过使用 find_package,CMake 项目可以有效地管理和链接复杂的依赖关系,减少手动设置路径和选项的错误,同时保持项目的可移植性。
这使得大型项目能够方便地集成和使用多种第三方库,而不需要手动配置每一个依赖。

使用:find_package(Boost REQUIRED)
描述:find_package 尝试找到 Boost 库。REQUIRED 参数表示如果 CMake 无法找到 Boost,它应该停止处理并报错。

使用:
set(QT_PATH "opt/homebrew/Cellar/qt/6.6.2_1")
set(CMAKE_PREFIX_PATH ${QT_PATH}/lib/cmake)
find_package(Qt6 COMPONENTS Widgets Core Concurrent REQUIRED)
描述:查找qt6模块,如果没有安装到标准路径,需要通过CMAKE_PREFIX_PATH变量指定搜索路径。


-->.命令:pkg_check_modules
使用:
pkg_check_modules(FFMPEG REQUIRED IMPORTED_TARGET 
                libavcodec<60
                libavcodec>=58.35
                libavformat>=58.20.100
                libavutil>=56.22
                libavfilter>=7.40
                libswscale>=5.3
                libavdevice>=58.5
                libswresample>=3.3
)
pkg_check_modules(SDL2 REQUIRED IMPORTED_TARGET sdl2>=2.0.9)
pkg_check_modules(Magick REQUIRED IMPORTED_TARGET Magick++>=6.9)
描述:检测库的版本。


-->.命令:add_custom_command.
使用:
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
  COMMAND ${PROJECT_NAME}
  WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
)
描述:设置编译后事件,编译完成后执行程序${PROJECT_NAME},设置工程目录${PROJECT_SOURCE_DIR}。

使用:
add_custom_command(TARGET ${PROJECT_NAME} PRE_BUILD
            COMMAND bash -c "mkdir -p ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}"
            COMMAND bash -c "tar -xf ${PROJECT_SOURCE_DIR}/../SDK/NDI/Lib/arm64/linux/libndi.tar.gz -C ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}"
        )
描述:设置编译前事件。

使用:
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
                        COMMAND bash -c "objcopy --only-keep-debug $<TARGET_FILE:${PROJECT_NAME}> $<TARGET_FILE:${PROJECT_NAME}>.debug"
                        COMMAND bash -c "objcopy --strip-debug $<TARGET_FILE:${PROJECT_NAME}>"
                        COMMAND bash -c "objcopy --strip-debug --add-gnu-debuglink=$<TARGET_FILE:${PROJECT_NAME}>.debug $<TARGET_FILE:${PROJECT_NAME}>"
                        VERBATIM
                       )
描述:设置编译后事件.


-->.命令:set_source_files_properties 
描述:用于设置特定源文件的属性。这可以用来改变特定文件的编译标志,或设置其他与文件相关的选项。

使用:set_source_files_properties(../VideoPlayerCore/ProgramListRender.cpp PROPERTIES COMPILE_FLAGS "-fpermissive")
描述:-fpermissive 是一个 GCC 和 Clang 编译器的标志,用于在遇到某些不符合 C++ 标准的代码时降低错误级别。这意味着,对于某些类型的非标准或错误的代码,编译器将发出警告,而不是错误,并尝试生成预期的代码。
 
使用:set_source_files_properties(${HLSL_FILES} PROPERTIES HEADER_FILE_ONLY TRUE) 
描述:指定${HLSL_FILES}文件不参与编译
 
 
-->.命令:
set(<variable> <value>... [CACHE <type> <docstring> [FORCE]])
这里的 <variable> 是你希望设置的变量的名称, <value> 是该变量的值。可以指定多个值,它们会作为一个列表被设置。可选的 CACHE 参数会将变量值存储在缓存中,使其在多次运行 CMake 时保持一致。<type> 定义了缓存条目的类型,可以是 BOOL, FILEPATH, PATH, STRING, INTERNAL, 或者 UNINITIALIZED。

BOOL: 布尔值(ON/OFF 或 TRUE/FALSE 或 YES/NO 或 1/0)
FILEPATH: 选择一个文件路径
PATH: 选择一个目录路径
STRING: 字符串
INTERNAL: 内部类型,不会在 GUI 中显示
UNINITIALIZED: 未初始化类型
<docstring> 是关于变量的描述信息。FORCE 参数将强制更新缓存变量,即使它已经被设置。

使用:
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
描述:设置c++ 标准为 c++11,并且编译器必须支持c++11标准,必须在命令add_executable之前。

使用:
set(Source_file
    "MyObjCClass.h"
    "MyObjCClass.m"
    "MyWrapper.h"
    "MyWrapper.mm"
    "main.cpp")
描述:设置源文件有哪些。

使用:set(CMAKE_CXX_COMPILER "clang++")
描述:设置c++编译器为clang++.

使用:set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR})
描述:设置可执行文件输出路径为宏PROJECT_SOURCE_DIR指定路径

使用:
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Release CACHE STRING  "Debug or Release" FORCE)
endif()
描述:如果没有设置CMAKE_BUILD_TYPE变量,就将变量CMAKE_BUILD_TYPE变量设置为Release,并保存在缓存中。

使用:set(ENV{PKG_CONFIG_PATH} "/opt/homebrew/opt/ffmpeg@4/lib/pkgconfig")
描述:设置环境变量PKG_CONFIG_PATH的值。

使用:set(CMAKE_PREFIX_PATH "/opt/local/mylib;/path/to/other/lib")
描述:设置包、库、文件的查找路径。


-->.命令:include
使用:
include(CommonSettings.cmake)
描述:用于加载并运行 CMake 代码文件(通常是 .cmake 文件),或者是包含预定义的 CMake 模块。
这个命令使你能够将常用的 CMake 代码片段组织在一个或多个文件中,然后在多个 CMake 列表文件中重用它们。
这有助于模块化、重用代码,并保持 CMake 列表文件的清洁和可管理。
如果文件不在默认的搜索路径中,你可能需要提供完整的路径或使用 CMAKE_MODULE_PATH 变量来调整模块搜索路径。


-->.命令:list(<subcommand> <args>...)
使用:
list(APPEND my_list item1 item2 item3)            :将一个或多个元素添加到列表的末尾。
list(LENGTH my_list length_variable)              :获取列表的长度。
list(GET my_list index result_variable)           :获取列表中一个或多个元素的值。
list(INSERT my_list index value)                  :在列表的特定位置插入元素。
list(REMOVE_ITEM my_list value_to_remove)         :从列表中删除所有指定的值。
list(REMOVE_AT my_list index1 index2 ...)         :根据索引从列表中删除元素。
list(REMOVE_DUPLICATES my_list)                   :删除列表中的重复项。
list(FIND my_list item variable_to_store_index)   :在列表中查找元素,并返回其索引。
list(SORT my_list)                                :对列表进行排序。
list(REVERSE my_list)                             :反转列表的元素顺序。
描述:是一个非常灵活的命令,用于创建和操作列表(即字符串向量)。列表在 CMake 中通常用于管理一系列的值,例如文件名、配置选项、或其他数据集。


-->.命令:include_external_msproject(projectname path_to_project_file
    [TYPE projectTypeGUID]
    [GUID projectGUID]
    [PLATFORM platformName]
    ...)
使用:include_external_msproject(OgreMain ${CMAKE_SOURCE_DIR}/Third/OgreNext/src/ogre-next/build_vs19_x64/OgreMain/OgreMain.vcxproj)
描述:用于将一个现有的 Microsoft Visual Studio 项目包含到 CMake 生成的解决方案中。
这使得可以在一个统一的工程环境内同时管理使用 CMake 构建的项目和使用 Visual Studio 工具直接开发的项目。
这在大型项目中非常有用,尤其是当你需要整合使用不同技术栈开发的各个部分时。


-->.命令:
function(<name> [arg1 [arg2 [...]]])
  # 函数体
endfunction()
使用:
# 定义一个函数来打印信息
function(print_message msg)
  message("Message: ${msg}")
endfunction()

# 调用函数
print_message("Hello, CMake Function!")

描述:用于定义一个新的函数,这样可以在你的 CMake 脚本中多次重用一段代码。这有助于简化脚本、增强可读性和维护性,特别是在处理复杂的构建逻辑时。


-->.命令:file(<subcommand> [arguments...])
使用:
file(GLOB files "src/*.cpp")                          :用于获取匹配指定模式的文件列表。
file(GLOB_RECURSE files "src/*.cpp")                  :递归地获取匹配指定模式的文件列表。
file(MAKE_DIRECTORY dir1 dir2 ...)                    :创建一个目录。
file(REMOVE file1 file2 ...)                          :删除一个文件或目录。
file(RENAME oldname newname)                          :重命名一个文件或目录。
file(COPY source1 source2 ... DESTINATION destination):复制文件或目录到目标位置。
file(READ filename variable)                          :读取文件内容到变量中。
file(WRITE filename "text to write")                  :将文本写入文件。
描述:


-->.命令:foreach
使用:
遍历列表中的元素:
foreach(loop_var IN LISTS <list1> <list2> ...)
  # 在这里执行一些操作
endforeach()

遍历指定范围的数字:
foreach(loop_var RANGE total)
foreach(loop_var RANGE start stop [step])
  # 在这里执行一些操作
endforeach()

遍历具有显式值的列表:
foreach(loop_var item1 item2 item3 ...)
  # 在这里执行一些操作
endforeach()
描述:foreach 命令是用来创建循环,它允许你对列表中的每一个元素执行一系列操作。这使得在处理列表、执行批量操作或者生成重复代码时非常有用。
使用 break() 和 continue() 命令可以控制循环的执行。break() 用于跳出当前循环,而 continue() 用于跳过当前迭代的剩余部分并开始下一个迭代。


-->.命令:
if(<condition>)
  # 条件为真时执行的代码
elseif(<condition2>)
  # 第二个条件为真时执行的代码
else()
  # 所有条件都不为真时执行的代码
endif()

使用:
基本条件判断:
set(MY_VAR "hello")
if(MY_VAR STREQUAL "hello")
  message("MY_VAR is hello")
endif()

多条件判断:
set(MY_NUM 100)
if(MY_NUM GREATER 50 AND MY_NUM LESS 200)
  message("MY_NUM is between 50 and 200")
endif()

文件存在性检查:
if(EXISTS ${PROJECT_SOURCE_DIR}/README.md)
  message("README exists")
else()
  message("README does not exist")
endif()

使用 ELSEIF 和 ELSE:
set(STATUS 404)
if(STATUS EQUAL 200)
  message("OK")
elseif(STATUS EQUAL 404)
  message("Not Found")
else()
  message("Error")
endif()

变量比较:
if(VAR):如果 VAR 被定义且不是 FALSE,0, N, NO, OFF, NOTFOUND 或 <VAR-NOTFOUND>,则为真。
if(NOT VAR):如果 VAR 未定义或其值为 FALSE 等,则为真。
文件和目录的测试:
if(EXISTS path/to/file-or-directory):如果指定路径的文件或目录存在,则为真。
if(IS_DIRECTORY directory):如果指定的是一个目录,则为真。
字符串比较:
if(STR1 STREQUAL STR2):如果两个字符串相等,则为真。
if(STR1 MATCHES regex):如果字符串符合指定的正则表达式,则为真。
数值比较:
if(NUM1 LESS NUM2):如果 NUM1 小于 NUM2,则为真。
if(NUM1 GREATER NUM2):如果 NUM1 大于 NUM2,则为真。
if(NUM1 EQUAL NUM2):如果 NUM1 等于 NUM2,则为真。
逻辑组合:
if(COND1 AND COND2):如果两个条件都为真,则为真。
if(COND1 OR COND2):如果至少一个条件为真,则为真。


-->.命令:source_group
使用:
source_group("Header Files" FILES include/myheader.h)
source_group("Source Files" FILES src/mysource.cpp)
source_group("Source Files/Render/VideoRender" FILES src/OpenglRender.cpp)
描述:
用于在 IDE(如 Visual Studio)中组织源代码文件,通过这个命令可以将特定的文件放入虚拟文件夹中,以便更好地管理大型项目的源代码结构。
这在视觉上有助于区分项目中的不同部分,使项目结构更清晰。
source_group对应的文件必须添加到add_executable或者add_library里面才能在工程里面显示出来。


-->.命令:
macro(<name> [arg1 [arg2 [...]]])
  # 宏体
endmacro()

使用:
# 定义一个宏
macro(print_detail name value)
  message("The detail of ${name} is: ${value}")
endmacro()

# 调用宏
print_detail("Speed" "Fast")

描述:
用于定义一段可以在 CMake 脚本中重复使用的代码块。与函数的比较:
作用域:
宏没有自己的作用域。在宏内部创建或修改的变量会影响调用宏的作用域。
函数有自己的局部作用域。在函数内部创建的变量不会影响外部作用域,除非显式地将它们传递回去。
参数处理:
宏直接使用实际的参数值,这就像是将宏内部的代码直接复制到调用点。
函数的参数通过值传递,形成独立的局部变量。
注意事项
使用宏的影响:因为宏没有独立的作用域,所以它们可以无意中修改全局变量或外部变量。这可能导致代码难以理解和维护。
调试:宏可能使得调试变得更加困难,因为错误信息可能指向宏内部,而实际的问题却在宏的使用环境中。
由于这些差异,推荐在需要保留作用域的情况下使用 function,而在确实需要影响外部作用域或者需要性能优化(避免函数调用开销)的情况下使用 macro。


-->.宏定义:
CMAKE_BINARY_DIR:
这个变量指向顶级的构建目录,即你在其上运行 cmake 命令的目录。这个值在整个项目中都是一样的,无论你在哪个子目录中。

CMAKE_SOURCE_DIR:
指向顶级源代码目录的变量,即包含顶级 CMakeLists.txt 文件的目录。

CMAKE_CURRENT_SOURCE_DIR:
这个变量指向当前处理的 CMakeLists.txt 文件所在的目录。这个值会随着 CMake 进程从一个目录跳转到另一个目录而改变。
也就是说,每当 CMake 进入一个新的目录并开始处理那个目录中的 CMakeLists.txt 文件时,CMAKE_CURRENT_SOURCE_DIR 就会被更新为那个目录的路径。

CMAKE_CURRENT_BINARY_DIR:
这个变量指向当前处理的 CMakeLists.txt 文件对应的构建目录。如果你在项目的顶级 CMakeLists.txt 文件中,它就指向顶级的构建目录。
但如果你在项目的一个子目录中(例如,你使用了 add_subdirectory 命令),CMAKE_CURRENT_BINARY_DIR 就会指向那个子目录在构建树中的对应目录。

PROJECT_SOURCE_DIR:
这个变量指向最近一次调用 project() 命令的目录。在顶级的 CMakeLists.txt 文件中,PROJECT_SOURCE_DIR 的值通常与 
CMAKE_SOURCE_DIR(顶级源代码目录)的值相同。然而,如果在项目中定义了子项目(通过调用 project() 命令),
那么在子项目的 CMakeLists.txt 文件中,PROJECT_SOURCE_DIR 就会指向那个子项目的源代码目录。

PROJECT_BINARY_DIR:
这个变量指向最近一次调用 project() 命令的构建目录。在顶级的 CMakeLists.txt 文件中,它和 CMAKE_BINARY_DIR 的值是一样的。
然而,如果你在项目中使用了 project() 命令来定义子项目,或者使用 add_subdirectory() 命令添加了子目录,
那么在子项目或子目录的 CMakeLists.txt 文件中,PROJECT_BINARY_DIR 就会指向那个子项目或子目录的构建目录,而不是顶级构建目录。

CMAKE_RUNTIME_OUTPUT_DIRECTORY:
是 CMake 的一个全局变量,用于指定所有运行时产物(如可执行文件和 Windows 平台下的 DLL)的输出路径。
这个变量可以在 CMakeLists.txt 文件中设置,其值应为一个目录的路径。然后,所有的可执行文件和 Windows 平台下的 DLL 就会被放到这个目录中,
而不是它们各自的构建目录。如果你只想要改变特定目标的输出目录,而不是所有目标,你可以使用 set_target_properties 
命令并设置 RUNTIME_OUTPUT_DIRECTORY 属性。

CMAKE_LIBRARY_OUTPUT_DIRECTORY:
是一个 CMake 变量,用于设置所有库文件(在 Unix/Linux 下是 .so 或 .dylib,在 Windows 下是 .dll)的输出路径。
这个变量在 CMakeLists.txt 文件中设置,其值应为一个目录的路径。设置后,所有的库文件就会被放到这个目录中,
而不是它们各自的构建目录。如果你只想要改变特定目标的输出目录,而不是所有目标,你可以使用 set_target_properties 
命令并设置 LIBRARY_OUTPUT_DIRECTORY 属性。

CMAKE_CXX_STANDARD :
是一个 CMake 变量,用于指定编译 C++ 代码时要使用的 C++ 标准。它的值应为标准的发布年份,
例如,11 表示 C++11,14 表示 C++14,17 表示 C++17,20 表示 C++20,等等。还要注意,这些设置是全局的,它们会影响到所有目标。
如果你只想要设置特定目标的 C++ 标准,你应该使用 target_compile_features 命令或者 set_target_properties 命令。

CMAKE_CXX_STANDARD_REQUIRED :
是一个 CMake 变量,用于指定如果编译器不支持 CMAKE_CXX_STANDARD 变量设置的 C++ 标准,CMake 是否应该报错并终止配置过程。
如果 CMAKE_CXX_STANDARD_REQUIRED 被设置为 TRUE 或 ON,并且编译器不支持 CMAKE_CXX_STANDARD 设置的 C++ 标准,CMake 将会报错并终止配置过程。
如果 CMAKE_CXX_STANDARD_REQUIRED 被设置为 FALSE 或 OFF(这是默认值),并且编译器不支持 CMAKE_CXX_STANDARD 设置的 C++ 标准,
CMake 将会尝试降级到更低的标准。

CMAKE_BUILD_TYPE :
是一个 CMake 变量,用于指定构建的类型。这个变量通常在单配置生成器(如 Make,Ninja 等)中使用,而不是多配置生成器(如 Visual Studio 或 Xcode)。
CMAKE_BUILD_TYPE 的设置会影响编译器标志和其他相关的构建设置。
Debug:这个设置会使用针对调试优化的编译器标志进行编译(例如,-g 在 GCC 和 Clang 中),并且不会进行任何优化。这是定位问题和进行调试的理想选择。
Release:这个设置会使用针对性能优化的编译器标志进行编译(例如,-O3 在 GCC 和 Clang 中)。这是准备发布的软件的理想选择。
RelWithDebInfo:这个设置类似于 Release,但也包含了调试信息。这对于需要进行性能分析的情况非常有用。
MinSizeRel:这个设置会使用编译器标志来生成尽可能小的代码(例如,-Os 在 GCC 和 Clang 中)。
这在嵌入式系统或者需要最小化程序大小的情况下很有用。

CMAKE_SYSTEM_NAME:
是一个 CMake 变量,用于确定目标系统的名称,它被用在交叉编译环境中。在交叉编译中,
编译器运行的系统(宿主系统)和最终运行编译后代码的系统(目标系统)是不同的。
CMAKE_SYSTEM_NAME 就是用来指定这个目标系统的。下面是一些可能的 CMAKE_SYSTEM_NAME 的值:
Windows:用于 Windows 系统。Linux:用于 Linux 系统。Darwin:用于 Apple 的 macOS 和 iOS 系统。Android:用于 Android 系统。

CMAKE_PREFIX_PATH :
是一个 CMake 变量,用于影响 CMake 在查找包(包括库和程序)时应考虑哪些路径。这个变量可以被设置为一个或多个路径,这些路径使用分号 (;) 分隔。
当你使用 find_package,find_library,find_file 等命令时,CMake 会在 CMAKE_PREFIX_PATH 列出的路径下寻找相关文件。
这对于那些安装在非标准位置的库来说尤其有用。

CMAKE_CXX_COMPILER_ID :
是一个 CMake 变量,用于获取当前 C++ 编译器的标识符。GNU:表示使用 GCC 编译器。Clang:表示使用 Clang 编译器。
AppleClang:表示使用 Apple 的 Clang 编译器。MSVC:表示使用 Microsoft Visual C++ 编译器。Intel:表示使用 Intel C++ 编译器。

CMAKE_HOST_SYSTEM_PROCESSOR :
是一个 CMake 变量,用于表示当前主机系统的处理器架构。以下是一些常见的 CMAKE_HOST_SYSTEM_PROCESSOR 值的示例:x86:表示 x86 架构(32 位)。
x86_64:表示 x86-64 或 AMD64 架构(64 位)。ARM:表示 ARM 架构。ARM64:表示 ARM64 架构。

EXECUTABLE_OUTPUT_PATH :
已经被弃用,使用CMAKE_RUNTIME_OUTPUT_DIRECTORY代替。

LIBRARY_OUTPUT_PATH :
已经被启用,使用CMAKE_LIBRARY_OUTPUT_DIRECTORY代替。


注意事项:
1.windows下不能使用add_compile_options(-std=c++17)来设置编译器支持的C++语言标准,需要用新的方式:
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
 

  • 14
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值