CMakeLists.txt 常用语法详解

ops/2024/12/23 10:08:45/

CMake 是一个跨平台的开源构建系统,广泛应用于C++项目中。CMake通过CMakeLists.txt文件来配置项目的构建过程。本文将介绍CMakeLists.txt的常用语法,帮助你快速上手并优化你的项目构建流程。

简介

CMakeLists.txt 是CMake的配置文件,用于定义项目的构建规则。通过编写CMakeLists.txt,开发者可以指定源代码文件、编译选项、依赖库等信息,从而生成适用于不同平台和编译器的构建系统。

基本语法

CMakeLists.txt 文件通常由一系列CMake命令组成,每个命令由命令名和参数构成,参数之间用空格或换行分隔。例如:

cmake">cmake_minimum_required(VERSION 3.10)
project(MyProject)add_executable(MyExecutable main.cpp)

常用命令

项目定义

使用 project() 命令定义项目名称及其相关信息。

cmake">project(MyProject VERSION 1.0 LANGUAGES CXX)
  • MyProject:项目名称
  • VERSION 1.0:项目版本
  • LANGUAGES CXX:使用的编程语言

指定 CMake 最低版本

使用 cmake_minimum_required() 指定所需的最低CMake版本。

cmake">cmake_minimum_required(VERSION 3.10)

设置编译标准

使用 set() 命令设置C++标准。

cmake">set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED True)
  • CMAKE_CXX_STANDARD:指定C++标准版本
  • CMAKE_CXX_STANDARD_REQUIRED:强制使用指定的标准版本

添加可执行文件和库

使用 add_executable()add_library() 添加可执行文件和库。

cmake">add_executable(MyExecutable main.cpp utils.cpp)
add_library(MyLibrary STATIC utils.cpp)
  • MyExecutableMyLibrary:目标名称
  • main.cpp, utils.cpp:源文件列表
  • STATIC:静态库类型(也可以是 SHARED 动态库)

包含目录

使用 include_directories()target_include_directories() 指定头文件搜索路径。

cmake">include_directories(${PROJECT_SOURCE_DIR}/include)# 更推荐的方式
target_include_directories(MyExecutable PRIVATE ${PROJECT_SOURCE_DIR}/include)

链接库

使用 target_link_libraries() 将库链接到目标。

cmake">target_link_libraries(MyExecutable PRIVATE MyLibrary)
  • PRIVATE:链接库的作用域(还有 PUBLICINTERFACE

添加子目录

使用 add_subdirectory() 添加子目录,便于模块化项目。

cmake">add_subdirectory(src)
add_subdirectory(tests)

设置编译选项

使用 target_compile_options() 设置编译选项。

cmake">target_compile_options(MyExecutable PRIVATE -Wall -Wextra)

示例项目结构

以下是一个简单的项目结构示例:

MyProject/
├── CMakeLists.txt
├── src/
│   ├── CMakeLists.txt
│   ├── main.cpp
│   └── utils.cpp
├── include/
│   └── utils.h
└── tests/├── CMakeLists.txt└── test_main.cpp

顶层 CMakeLists.txt

cmake">cmake_minimum_required(VERSION 3.10)
project(MyProject VERSION 1.0 LANGUAGES CXX)set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED True)add_subdirectory(src)
add_subdirectory(tests)

src/CMakeLists.txt

cmake">add_library(MyLibrary STATIC utils.cpp)
target_include_directories(MyLibrary PUBLIC ${PROJECT_SOURCE_DIR}/include)add_executable(MyExecutable main.cpp)
target_link_libraries(MyExecutable PRIVATE MyLibrary)

tests/CMakeLists.txt

cmake">add_executable(TestExecutable test_main.cpp)
target_link_libraries(TestExecutable PRIVATE MyLibrary)

高级用法

条件语句

使用 if(), else(), endif() 实现条件构建。

cmake">if(WIN32)target_compile_definitions(MyExecutable PRIVATE WINDOWS)
elseif(UNIX)target_compile_definitions(MyExecutable PRIVATE UNIX)
endif()

变量和缓存变量

定义变量使用 set(),缓存变量可以在配置时通过 -D 传递。

cmake">set(SOURCE_FILES main.cpp utils.cpp)
set(MY_OPTION ON CACHE BOOL "Enable my option")

自定义命令和目标

使用 add_custom_command()add_custom_target() 添加自定义构建步骤。

cmake">add_custom_command(OUTPUT generated.cppCOMMAND python generate.pyDEPENDS generate.py
)add_custom_target(Generate ALL DEPENDS generated.cpp)

总结

CMakeLists.txt 是CMake构建系统的核心,通过掌握其常用语法和命令,可以高效地管理和构建复杂的项目。本文介绍了CMakeLists.txt的基本结构、常用命令及其应用示例,帮助你快速上手并优化项目构建流程。随着项目规模的扩大,CMake的高级功能如条件构建、自定义命令等也能为你的开发带来更大的灵活性和便利性。


http://www.ppmy.cn/ops/144280.html

相关文章

如何在 Mechanical LS-DYNA 中设置自适应实体到 SPH 模型

总结 在这篇博文中,介绍了 LS-DYNA 功能的“Adaptive Solid to SPH”在 Ansys Mechanical 中的使用。解释了 SPH 公式与经典实体元素相结合的使用,并通过一个简单的示例开发了设置及其主要参数。 什么是 SPH? 平滑粒子流体动力学 &#xff…

【快速上手Docker 简单配置方法】

Docker 是一种容器化平台,它能够将应用程序和其依赖的环境打包在一个容器中,实现应用程序在不同环境中的移植性和可重复性。 Docker 的基本概念包括以下几个部分: 镜像(Image):镜像是一个只读的文件系统&a…

shiny数字输入框

在 Shiny 应用中,可以使用 numericInput 函数来创建一个数字输入框。numericInput 函数允许用户输入一个数值,并提供了多种选项来定制输入框的外观和行为。 在 Shiny 应用中使用 numericInput? 创建一个新的 Shiny 应用文件夹,并…

Unity中通过代码设置材质HDR颜色的方法参考

在Unity中,如果一个材质的颜色是HDR的颜色,此时要使用代码来设置HDR颜色的效果,应该使用Material.SetVector,而不是Material.SetColor,因为使用Material.Color设置颜色时,rgb的值无法突破1,但是…

计算机基础知识复习12.21

HashMap的put过程 1.根据要添加的键的哈希码计算在数组中的位置 2.检查该位置是否为空(即没有键值对存在) 3.如果为空,则直接在该位置创建一个新的Entry对象来存储键值对 4.如果该位置已经存在其他键值对,检查该位置的第一个键…

Xcode 文件缺失:Missing submodule xxx

问题&#xff1a;警告或者报错&#xff1a;Missing submodule xxx 引用方式为: <XXXX/******.h> 即 <项目名/头文件名称.h> 原因&#xff1a;这种问题主要是项目名称和 文件&#xff08;主要是头文件 命名重复了&#xff09; 经过谷歌查询 原因是创建的库名称自动…

源码分析之Openlayers中MousePosition鼠标位置控件

概述 本文主要介绍 Openlayers 中的MousePosition鼠标位置控件&#xff0c;该控件会创建一个元素在页面的右上方用来实时显示鼠标光标的位置坐标。该控件在实际应用很有效&#xff0c;可以实时获取鼠标位置&#xff0c;但是一般控件元素都会自定义。 源码分析 MousePosition…

2024小迪安全信息收集第七课

目录 ICO图标 Django Flask Tornado 一、#JavaScript-开发框架-Vue&Node.js Vue Node.js 二、#PHP-开发框架-ThinkPHP&Laravel&Yii ThinkPHP Laravel Yii 三、#Java-框架组件-Fastjson&Shiro&Solr&Spring 52类110个主流Java组件和框架介绍…