• CMakeList整理大全


    0. CMake应用示例

    之前我们也整理过cmake 引入第三方库(头文件目录、库目录、库文件)。但是这里面整理的内容其实是不全的。所以我们需要进一步将CMake的使用整理好。以供后面的学习的工程师来检索查询。

    1. cmake-template
    2. ├── CMakeLists.txt
    3. └── build
    4. └── include
    5. └── src
    6. └── main.cpp

    1. CMakeList基础15例

    1. # 设置CMake的最低版本要求
    2. cmake_minimum_required(VERSION 3.15)
    3. # 设置项目名称和版本
    4. project(MyProject VERSION 1.0 DESCRIPTION "An example project with CMake")
    5. # 选项,可以通过-D在命令行定义
    6. option(USE_CUSTOM_LIBRARY "Use a custom library" ON)
    7. # 定义条件预处理器宏
    8. if(USE_CUSTOM_LIBRARY)
    9. add_definitions(-DUSE_CUSTOM_LIB)
    10. endif()
    11. # 寻找外部依赖包
    12. find_package(Threads REQUIRED)
    13. # 指定头文件的搜索路径
    14. include_directories(${PROJECT_SOURCE_DIR}/include)
    15. # 指定库文件搜索路径
    16. link_directories(${PROJECT_SOURCE_DIR}/libs)
    17. # 添加子目录,这些目录下也应该有自己的CMakeLists.txt
    18. add_subdirectory(src)
    19. add_subdirectory(libs)
    20. # 添加一个可执行文件
    21. add_executable(myExecutable src/main.cpp)
    22. # 添加一个静态库
    23. add_library(myStaticLib STATIC src/myStaticLib.cpp)
    24. # 添加一个动态库
    25. add_library(mySharedLib SHARED src/mySharedLib.cpp)
    26. # 设置静态库和动态库的属性
    27. set_target_properties(myStaticLib PROPERTIES
    28. ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/static_lib"
    29. )
    30. set_target_properties(mySharedLib PROPERTIES
    31. LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/shared_lib"
    32. VERSION ${PROJECT_VERSION}
    33. )
    34. # 设置可执行文件的属性
    35. set_target_properties(myExecutable PROPERTIES
    36. RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin"
    37. OUTPUT_NAME "myExecutableFinal"
    38. )
    39. # 指定链接库
    40. target_link_libraries(myExecutable PRIVATE myStaticLib mySharedLib Threads::Threads)
    41. # 安装规则
    42. install(TARGETS myExecutable myStaticLib mySharedLib
    43. RUNTIME DESTINATION bin
    44. LIBRARY DESTINATION lib
    45. ARCHIVE DESTINATION lib/static
    46. )
    47. # 包含目录
    48. target_include_directories(myExecutable PRIVATE ${PROJECT_SOURCE_DIR}/include)
    49. # 自定义命令和依赖
    50. add_custom_target(run
    51. COMMAND myExecutable
    52. )
    53. add_dependencies(run myExecutable)
    54. # 宏定义,用于打印消息
    55. macro(print_details)
    56. message("Project details: ${PROJECT_NAME} version ${PROJECT_VERSION}")
    57. endmacro()
    58. print_details()
    59. # 文件操作示例
    60. file(GLOB_RECURSE MY_SOURCES "src/*.cpp")
    61. target_sources(myExecutable PRIVATE ${MY_SOURCES})
    62. # 配置文件生成
    63. configure_file(config.h.in ${CMAKE_BINARY_DIR}/config.h)
    64. # 源文件目录搜索
    65. aux_source_directory(. DIR_SRCS)
    66. add_executable(myProgram ${DIR_SRCS})
    67. # 添加目录,引入其他项目
    68. add_subdirectory(external)
    69. # 自定义目标,不产生输出文件
    70. add_custom_target(CustomCommand ALL
    71. COMMAND echo "Executing a custom command"
    72. COMMENT "This is a custom build step"
    73. )
    74. # 文件复制命令
    75. file(COPY ${CMAKE_SOURCE_DIR}/data.txt DESTINATION ${CMAKE_BINARY_DIR})

    1.1 cmake_minimum_required

    制定CMake的最小版本。它确保了 CMake 的特定版本或更高版本的特性能够被利用,并且保证了在旧版本的 CMake 中可能导致未知行为的特性不会被误用。

    基本语法:

    cmake_minimum_required(VERSION major.minor[.patch][.tweak] [FATAL_ERROR])
    
    • VERSION 关键字后面跟着所需的最低版本号。
    • FATAL_ERROR 是一个可选的参数,它在 CMake 的老版本中是必需的,如果用户使用的是比指定的 VERSION 更老的 CMake 版本,CMake 会报告一个致命错误并停止处理。在新版本的 CMake 中,默认情况下,如果版本不满足要求,CMake 就会报错并停止。

    1.2 project

    声明项目的名称和版本,并可选择指定支持的编程语言.此指令通常位于CMakeLists.txt文件的顶部,紧跟在cmake_minimum_required指令之后。

    基本语法:

    1. project(<PROJECT-NAME> [VERSION <major>[.<minor>[.<patch>[.<tweak>]]]]
    2. [DESCRIPTION <project-description-string>]
    3. [HOMEPAGE_URL <url-string>]
    4. [LANGUAGES <language-name>...])
    •  是你的项目名称。
    • VERSION 关键字后面可以跟随项目的版本号。
    • DESCRIPTION可以添加项目描述。
    • HOMEPAGE_URL可以指定项目主页的URL。
    • LANGUAGES关键字后面可以跟一系列编程语言名称,例如 C, CXX (代表C++),CUDA,Fortran 等。如果不指定语言,CMake默认启用 C 和 CXX。

    1.3 $$

    CMake中的美元符号与括号一起使用,形如{...},用于引用变量的值。最常用的就是和project联系起来,例如:

    基本语法:

    1. # 设置项目名称和版本
    2. project(MyProject VERSION 1.2.3 LANGUAGES CXX)
    3. set(MY_VARIABLE "Hello, World")
    4. message("Project name: ${PROJECT_NAME}")
    5. message("Project version: ${PROJECT_VERSION}")
    6. message(${MY_VARIABLE})

    $${MY_VARIABLE} 会被 CMake 替换为变量 MY_VARIABLE 的值.而project 指令将会创建一些变量,比如 PROJECT_NAMEPROJECT_VERSION 等,这些变量随后可以被引用。

    1.4 set

    在CMake中,set命令用于定义和修改变量。这个命令非常灵活,是CMake脚本中用得最频繁的指令之一,因为它可以用来存储各种类型的数据,如字符串、文件路径、列表(即字符串数组)、布尔值等。

    基本语法:

    set(<variable> <value> [CACHE <type> <docstring> [FORCE]])
    

     是你要设置的变量名。
     是分配给变量的值。可以是一个或多个值(如果是多个值,它们会被视为一个列表)。
    CACHE 选项用于将变量存储到CMake的缓存中,这对于可配置的选项很有用,因为它们在不同的构建中保持不变,除非被用户或者项目脚本修改。
     指定缓存中的变量类型,如STRING、BOOL等。
     是对变量的描述,通常出现在CMake GUI中。
    FORCE 用于强制覆盖缓存中的值,即使用户已经设置了该值。

    在 CMake 中,set 指令用于设置变量的值。它的基本语法如下:

    set(my_variable "Hello, World!")
    
    1. 设置一个列表变量:
    set(my_list 1 2 3 4 5)
    
    1. 设置一个缓存变量:
    1. set(my_cached_variable Release CACHE STRING "Set C++ Compiler Flags" FORCE) # Release or Debug
    2. # 取消缓存条目
    3. unset(<variable> CACHE)

    CMakeCache.txt文件用于存储缓存条目,第一次构建时会生成该文件,之后的构建并不会创建该文件。在引用缓存条目时,会去查找该文件,并返回值。

    在使用 set()命令时,默认情况下,如果缓存条目在 CMakeCache.txt 文件不存在,会创建缓存条目,并写入到 CMakeCache.txt文件中。如果缓存条目在 CMakeCache.txt文件存在,忽略 set() 命令,不会覆盖现有的缓存条目。但是我们想强制覆盖现有的缓存条目,我们可以 FORCE 选项。

    1. 强制设置一个缓存变量:
    set(my_cached_variable "Another value" CACHE STRING "Description of my_cached_variable" FORCE)
    

    以上是 set 指令的基本语法和使用示例,你可以根据具体的需求设置不同类型的变量,如普通变量、列表变量或者缓存变量。

    1.5 option

    在 CMake 中,option 指令用于定义一个布尔类型的选项,这个选项可以用来控制编译过程中的一些行为或特性。基本语法如下:

    基本语法:

    option(<option_variable> "" [initial_value])
    

    其中:

    •  是要定义的选项的变量名。
    • "" 是对选项的描述,会显示在 CMake GUI 或者命令行帮助信息中。
    • [initial_value] 是选项的初始值,可选,默认为 OFF

    下面是定义一个开关选项,表示是否启用某个特性:

    option(ENABLE_FEATURE "Enable some feature" ON)
    

    1.6 add_definitions

    在 CMake 中,add_definitions 指令用于向编译器添加预定义的宏定义。这些宏定义将在编译源文件时起作用。基本语法如下:

    add_definitions(-D<macro1> [-D<macro2>] ...)
    

    其中:

    • -D 表示要定义的宏,-D 后跟着宏的名称。如果宏需要带有值,则可以使用等号(=)将宏名称与值分隔开。

    下面是一些 add_definitions 指令的使用示例:

    1. 定义一个简单的宏:
    add_definitions(-DENABLE_LOGGING)
    
    1. 定义一个带有值的宏:
    add_definitions(-DDEBUG_LEVEL=2)
    
    1. 定义多个宏:
    add_definitions(-DENABLE_FEATURE_A -DENABLE_FEATURE_B)
    

    通过 add_definitions 可以向编译器传递预定义的宏,这些宏在编译源文件时将起到作用。需要注意的是,使用 add_definitions 添加的宏定义将应用于整个项目中的所有源文件。

    1.7 find_package

    当使用 find_package 时,你需要指定要查找的软件包的名称,并可能需要提供版本信息和一些其他选项。以下是 find_package 的基本语法和详细使用例子:

    基本语法:

    1. find_package( [version] [EXACT] [QUIET] [MODULE] [REQUIRED]
    2. [COMPONENTS [components...]]
    3. [OPTIONAL_COMPONENTS components...]
    4. [NO_POLICY_SCOPE])

    参数说明:

    • : 要查找的软件包的名称。
    • version: 可选参数,用于指定软件包的版本。
    • EXACT: 可选参数,要求找到的软件包的版本必须与指定的版本完全匹配。
    • QUIET: 可选参数,如果找不到软件包不会产生错误消息。
    • MODULE: 可选参数,表示要查找的软件包是一个模块文件而不是一个软件包。
    • REQUIRED: 可选参数,表示找不到软件包时会产生错误消息并停止配置过程。
    • COMPONENTS [components...]: 可选参数,用于指定软件包的组件。
    • OPTIONAL_COMPONENTS components...: 可选参数,用于指定可选的软件包组件。
    • NO_POLICY_SCOPE: 可选参数,指示 CMake 不要修改 CMake 策略。

    使用例子:

    点击CMakeList整理大全 - 古月居 (guyuehome.com)可查看全文

  • 相关阅读:
    本周SQL优化实战分享
    Node.js_基础知识(CommonJS模块化)
    FEELM利用能源管理系统建设绿色工厂,减少500吨碳排放
    12-Hive的基本概念以及基本操作
    eBPF会成为服务网格的未来吗?
    设计模式学习
    记录软考学习
    JavaScript对象与内置对象
    docker的登录证书和账号查看
    快速排序压缩算法2024年最新一种压缩算法
  • 原文地址:https://blog.csdn.net/weixin_68094467/article/details/139981300