上位机知识篇---CMake

server/2025/1/30 7:28:26/

文章目录

  • 前言
  • CMake
    • 基本指令
      • 最低版本要求
      • 项目名称
    • 编译选项
      • 编译器添加全局编译选项
      • 预处理定义
      • 标准版本
    • 指定其源文件
      • 指定可执行文件及其源文件
      • 指定库文件及其源文件
    • 指定包含目录
      • 添加头文件搜索路径
      • 添加特定目标搜索路径
    • 指定链接库
      • 添加库文件的搜索路径
      • 指定可执行文件或需要链接的库
    • 控制构建流程
      • 添加子目录、指定输出目录
      • 查找源文件、并存储
    • 安装规则
      • 安装目标到指定路径
      • 安装文件到指定路径
    • 查找包
      • 查找并加载外部包
      • 查找库文件
    • 逻辑控制
    • 宏和函数
    • 属性设置
    • 打印消息
  • 总结


前言

以上就是今天要讲的内容,本文简单介绍了CMakeCMakeLists.txt的基本语法。


CMake_14">CMake

CMake 是一个跨平台安装(编译工具,能够使用简单的声明性语句描述所有平台的安装(编译过程)。在 CMake 中,构建系统的描述是通过编写 CMakeLists.txt 文件来实现的。以下是 CMake 中常用的一些规则和指令的详细介绍:

基本指令

最低版本要求

cmake_minimum_required(VERSION 3.10)
指定 CMake 最低版本要求。

项目名称

project(MyProject)
设置项目名称,并隐式定义了几个变量,如 PROJECT_SOURCE_DIR 和 PROJECT_BINARY_DIR。

编译选项

编译器添加全局编译选项

指定编译选项
add_compile_options()
编译器添加全局编译选项。

预处理定义

add_definitions(-DFOO -DBAR)
添加预处理定义。

标准版本

set(CMAKE_CXX_STANDARD 11)
设置 C++ 的标准版本。

指定其源文件

指定可执行文件及其源文件

指定源文件
add_executable(myapp main.cpp src/foo.cpp)
指定要编译的可执行文件及其源文件。

指定库文件及其源文件

add_library(mylib STATIC src/foo.cpp src/bar.cpp)
指定要编译的库其源文件,可以是 STATIC, SHARED 或 MODULE 类型。

指定包含目录

添加头文件搜索路径

指定包含目录
include_directories(/usr/local/include)
添加头文件搜索路径。

添加特定目标搜索路径

target_include_directories(mylib PUBLIC /usr/local/include)
为特定目标添加头文件搜索路径。

指定链接库

添加库文件的搜索路径

指定链接库
link_directories(/usr/local/lib)
添加库文件搜索路径。

指定可执行文件或需要链接的库

target_link_libraries(myapp mylib)
指定可执行文件或库需要链接的库。

控制构建流程

添加子目录、指定输出目录

控制构建流程
add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
添加一个子目录,并可以指定构建输出目录。

查找源文件、并存储

aux_source_directory(. SRC_LIST)
查找指定目录下的所有源文件,并将列表存储在一个变量中。

安装规则

安装目标到指定路径

安装规则
install(TARGETS mylib myapp DESTINATION bin)
安装目标到指定路径。

安装文件到指定路径

install(FILES COPYRIGHT README DESTINATION share/doc/cmake)
安装文件到指定路径。

查找包

查找并加载外部包

查找包
find_package(PackageName [version] [EXACT] [QUIET] [REQUIRED])
查找并加载外部包的设置。

查找库文件

find_library(LIBRARY_NAME NAMES libraryname PATHS /usr/local/lib)
查找库文件。

逻辑控制

逻辑控制
if(MSVC)
检查是否在 Microsoft Visual C++ 编译器下。
elseif(${CMAKE_BUILD_TYPE} MATCHES Debug)
检查构建类型是否为 Debug。
else()
否则。
endif()
结束 if 语句。

宏和函数

宏和函数
macro()
定义宏,宏调用时会直接展开代码
function()
定义函数,函数调用时会传递参数。

属性设置

属性设置
set_target_properties(target1 target2 … PROPERTIES prop1 value1 prop2 value2 …)
设置目标的属性。

##其他指令

其他指令
option(USE_SOME_FEATURE “Use some feature” ON)
提供一个选项,用户可以选择是否启用。

打印消息

message(STATUS “This is a status message”)
打印消息,可以是 STATUS, SEND_ERROR, FATAL_ERROR 等。

这些规则和指令只是 CMake 中的冰山一角。CMake 的功能非常强大,支持模块化、跨平台构建,以及许多高级特性,如生成器表达式和自定义命令CMakeLists.txt 文件可以根据项目的复杂度变得非常复杂,因此理解和掌握这些基本规则是编写高效 CMake 脚本的关键。


总结

以上就是今天要讲的内容,本文仅仅简单介绍了CMakeCMakeLists.txt的基本语法。


http://www.ppmy.cn/server/163021.html

相关文章

C语言中的函数指针(Function Pointers):中英双语

C语言中的函数指针 在C语言中,函数指针是一个非常强大的特性。它允许我们存储和传递指向函数的指针,从而实现更灵活的代码设计,例如动态调用不同的函数、实现回调机制等。 前言 今天在阅读 https://www.buildyourownlisp.com/这本书的时候&…

从0到1:C++ 开启游戏开发奇幻之旅(一)

目录 为什么选择 C 进行游戏开发 性能卓越 内存管理精细 跨平台兼容性强 搭建 C 游戏开发环境 集成开发环境(IDE) Visual Studio CLion 图形库 SDL(Simple DirectMedia Layer) SFML(Simple and Fast Multim…

2025年01月22日Github流行趋势

项目名称:llm-course 项目地址url:https://github.com/mlabonne/llm-course项目语言:Jupyter Notebook历史star数:43588今日star数:304项目维护者:mlabonne, pitmonticone项目简介:一个课程&…

mysql DDL可重入讨论

mysql的bug:当执行 MySQL online DDL 时,期间如有其他并发的 DML 对相同的表进行增量修改,比如 update、insert、insert into … on duplicate key、replace into 等,且增量修改的数据违背唯一约束,那么 DDL 最后都会执…

【STL】list 双向循环链表的使用介绍

STL中list容器的详细使用说明 一.list的文档介绍二. list的构造函数三.list中的访问与遍历操作四.list中的修改操作4.1 list中的各种修改操作4.2 list的迭代器失效问题 五.list中的其他一些操作 一.list的文档介绍 list是可以在常数范围内在任意位置进行插入和删除的序列式容器…

PC端实现PDF预览(支持后端返回文件流 || 返回文件URL)

一、使用插件 插件名称:vue-office/pdf 版本:2.0.2 安装插件:npm i vue-office/pdf^2.0.2 1、“vue-office/pdf”: “^2.0.2”, 2、 npm i vue-office/pdf^2.0.2 二、代码实现 // 引入组件 (在需要使用的页面中直接引入&#x…

Web3 与数据隐私:如何让用户掌控个人信息

随着数字化时代的快速发展,互联网已经渗透到我们生活的方方面面,个人数据的收集与使用也变得越来越普遍。与此同时,数据隐私问题逐渐成为全球关注的焦点。传统的互联网平台通常将用户的数据存储在中心化的服务器上,这意味着平台拥…

Android 自定义View时四个构造函数使用详解

该文章我们以自定义View继承TextView为例来讲解 创建自定义View命名MyTextView,并使其继承TextView 1、自定义View时第一个构造函数 // 第一个构造函数主要是在Java代码中声明一个MyTextView时所用 // 类似这种(MyTextView myTextViewnew MyTextView(this);) // 不…