CMakeList整理大全

0. CMake应用示例

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

cmake-template
├── CMakeLists.txt
└── build
└── include
└── src
     └── main.cpp

1. CMakeList基础15例

# 设置CMake的最低版本要求
cmake_minimum_required(VERSION 3.15)

# 设置项目名称和版本
project(MyProject VERSION 1.0 DESCRIPTION "An example project with CMake")

# 选项,可以通过-D在命令行定义
option(USE_CUSTOM_LIBRARY "Use a custom library" ON)

# 定义条件预处理器宏
if(USE_CUSTOM_LIBRARY)
    add_definitions(-DUSE_CUSTOM_LIB)
endif()

# 寻找外部依赖包
find_package(Threads REQUIRED)

# 指定头文件的搜索路径
include_directories(${PROJECT_SOURCE_DIR}/include)

# 指定库文件搜索路径
link_directories(${PROJECT_SOURCE_DIR}/libs)

# 添加子目录,这些目录下也应该有自己的CMakeLists.txt
add_subdirectory(src)
add_subdirectory(libs)

# 添加一个可执行文件
add_executable(myExecutable src/main.cpp)

# 添加一个静态库
add_library(myStaticLib STATIC src/myStaticLib.cpp)

# 添加一个动态库
add_library(mySharedLib SHARED src/mySharedLib.cpp)

# 设置静态库和动态库的属性
set_target_properties(myStaticLib PROPERTIES
    ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/static_lib"
)
set_target_properties(mySharedLib PROPERTIES
    LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/shared_lib"
    VERSION ${PROJECT_VERSION}
)

# 设置可执行文件的属性
set_target_properties(myExecutable PROPERTIES
    RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin"
    OUTPUT_NAME "myExecutableFinal"
)

# 指定链接库
target_link_libraries(myExecutable PRIVATE myStaticLib mySharedLib Threads::Threads)

# 安装规则
install(TARGETS myExecutable myStaticLib mySharedLib
    RUNTIME DESTINATION bin
    LIBRARY DESTINATION lib
    ARCHIVE DESTINATION lib/static
)

# 包含目录
target_include_directories(myExecutable PRIVATE ${PROJECT_SOURCE_DIR}/include)

# 自定义命令和依赖
add_custom_target(run
    COMMAND myExecutable
)
add_dependencies(run myExecutable)

# 宏定义,用于打印消息
macro(print_details)
    message("Project details: ${PROJECT_NAME} version ${PROJECT_VERSION}")
endmacro()
print_details()

# 文件操作示例
file(GLOB_RECURSE MY_SOURCES "src/*.cpp")
target_sources(myExecutable PRIVATE ${MY_SOURCES})

# 配置文件生成
configure_file(config.h.in ${CMAKE_BINARY_DIR}/config.h)

# 源文件目录搜索
aux_source_directory(. DIR_SRCS)
add_executable(myProgram ${DIR_SRCS})

# 添加目录,引入其他项目
add_subdirectory(external)

# 自定义目标,不产生输出文件
add_custom_target(CustomCommand ALL
    COMMAND echo "Executing a custom command"
    COMMENT "This is a custom build step"
)

# 文件复制命令
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指令之后。

基本语法:

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

1.3 $$

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

基本语法:

# 设置项目名称和版本
project(MyProject VERSION 1.2.3 LANGUAGES CXX)
set(MY_VARIABLE "Hello, World")

message("Project name: ${PROJECT_NAME}")
message("Project version: ${PROJECT_VERSION}")
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]])

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

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

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

# 取消缓存条目
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> "<help_string>" [initial_value])

其中:

  • <option_variable> 是要定义的选项的变量名。
  • "<help_string>" 是对选项的描述,会显示在 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<macro> 表示要定义的宏,-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 的基本语法和详细使用例子:

基本语法:

find_package(<package_name> [version] [EXACT] [QUIET] [MODULE] [REQUIRED]
             [COMPONENTS [components...]]
             [OPTIONAL_COMPONENTS components...]
             [NO_POLICY_SCOPE])

参数说明:

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

使用例子:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/750436.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

The First Descendant第一后裔联机失败、联机报错这样处理

第一后裔/The First Descendant是一款免费的多人合作射击游戏&#xff0c;玩家将进入一片混乱的英格里斯大陆&#xff0c;扮演继承者后裔&#xff0c;通过各种主支线任务和故事剧情触发&#xff0c;最终揭开自身的秘密&#xff0c;并带领大家一起抵抗邪恶势力的入侵。为了避免玩…

【Java Web】三大域对象

目录 一、域对象概述 二、三大域对象 三、域对象使用相关API 一、域对象概述 一些可用于存储数据和传递数据的对象被称为域对象&#xff0c;根据传递数据范围的不同&#xff0c;我们称之为不同的域&#xff0c;不同的域对象代表不同的域&#xff0c;共享数据的范围也不同。 二、…

ISP IC/FPGA设计-第一部分-SC130GS摄像头分析-IIC通信(1)

1.摄像头模组 SC130GS通过一个引脚&#xff08;SPI_I2C_MODE&#xff09;选择使用IIC或SPI配置接口&#xff0c;通过查看摄像头模组的原理图&#xff0c;可知是使用IIC接口&#xff1b; 通过手册可知IIC设备地址通过一个引脚控制&#xff0c;查看摄像头模组的原理图&#xff…

数据库调优厂商 OtterTune 宣布停止运营

昨天刷到消息&#xff0c;得知数据库优化厂商 OtterTune 停止了运营。OtterTune 的成员主要来自 CMU Andy Pavlo 教授领导的数据库实验室。公司正式成立于 2021 年 5 月&#xff0c;融资了 1450 万美金。 按照 Andy 教授的说法&#xff0c;公司是被一个收购 offer 搞砸了。同时…

npm-check【实用教程】升级项目中的依赖

安装 npm-check npm i -g npm-check检查项目中的依赖 npm-check会显示项目中没有使用&#xff0c;以及有新版本的依赖 升级项目中的依赖 npm-check -u方向键上下可以移动图中左侧的箭头空格键可选中/取消选中标注为 Major Update 和 Non-semver 类的版本&#xff0c;需去官网查…

用MySQL和navicatpremium做一个项目—(财务管理系统)。

1 ER图缩小的话怕你们看不清&#xff0c;所以截了两张图 2 vsdx绘图结果 3DDL和DML,都有点长分了好多次上传&#xff0c;慢慢看 DDL -- 用户表 CREATE TABLE users (user_id INT AUTO_INCREMENT PRIMARY KEY COMMENT 用户ID,username VARCHAR(50) NOT NULL UNIQUE COMMENT 用…

奔驰汽车的通信如此固若金汤的原因

随着摄像系统、距离控制、航线保持等功能以及制动辅助系统、制动力分配系统、车身侧倾干预与缓解系统等功能的飞速发展,汽车的系统功能之间已经不再独立,而是呈现互相合作的关系,各功能之间的无缝集成更是各大整车厂追求的目标。俗话说,外练筋骨皮,内练一口气,有了各式安…

第4章 客户端-客户端案例分析

1 Redis内存陡增 1.1.现象 服务端现象&#xff1a;Redis主节点内存陡增&#xff0c;几乎用满maxmemory&#xff0c;而从节点内存并没有变化&#xff08;正常情况下主从节点内存使用量基本相同&#xff09;。 客户端现象&#xff1a;客户端产生了OOM异常&#xff0c;也就是Redis…

桃园三结义 | 第1集 | 三人一条心,黄土变成金,有你带着俺,大事定能成功啊!| 正所谓择木之禽,得其良木,择主之臣,得遇明主 | 三国演义 | 群雄逐鹿

&#x1f64b;大家好&#xff01;我是毛毛张! &#x1f308;个人首页&#xff1a; 神马都会亿点点的毛毛张 &#x1f4cc;这篇博客是毛毛张结合三国演义原著分享三国演义文学剧本中的经典台词和语句&#xff0c;本篇分享的是《三国演义》第Ⅰ部分《群雄逐鹿》的第1️⃣集《桃…

eNSP中VRRP的配置和使用

一、基础配置 1.新建拓扑图 2.配置vlan a.CORE-S1 <Huawei>system-view [Huawei]sysname CORE-S1 [CORE-S1]vlan 10 [CORE-S1-vlan10]vlan 20 [CORE-S1-vlan20]vlan 30 b.CORE-S2 <Huawei>system-view [Huawei]sysname CORE-S2 [CORE-S2]vlan 10 [CORE…

2024年6月27日 (周四) 叶子游戏新闻

老板键工具来唤去: 它可以为常用程序自定义快捷键&#xff0c;实现一键唤起、一键隐藏的 Windows 工具&#xff0c;并且支持窗口动态绑定快捷键&#xff08;无需设置自动实现&#xff09;。 喜马拉雅下载工具: 字面意思 Steam国产“类8番”游戏《永恒逃脱&#xff1a;暗影城堡》…

软件协同开发是一种通过团队合作来创建软件的开发方法

软件协同开发是一种通过团队合作来创建软件的开发方法。与传统的瀑布模型相比&#xff0c;软件协同开发强调团队成员之间的合作和沟通&#xff0c;以实现更高效的开发过程和更优质的软件产品。 在软件协同开发中&#xff0c;团队成员通过一系列工具和技术来协同工作。这些工具…

视觉灵感的探索和分享平台

做设计没灵感&#xff1f;大脑一片空白&#xff1f;灵感是创作的源泉&#xff0c;也是作品的灵魂所在。工作中缺少灵感&#xff0c;这是每个设计师都会经历的苦恼&#xff0c;那当我们灵感匮乏的时候&#xff0c;该怎么办呢&#xff1f;别急&#xff0c;即时设计、SurfCG、Lapa…

一种PCB外壳设计方法的尝试

一个异性PCB的板框&#xff0c;外壳&#xff0c;PCB设计&#xff1a; 正常情况下先由机械工程师用CAD设计出板框导出DXF文件&#xff0c;之后基于此DXF文件作为板框进行PCB设计和外壳设计&#xff0c;但对硬件工程师来讲有时候直接在PCB软件上进行简单的板框设计显得更方便&am…

apktool反编译apk工具

Android apk安装包反编译——apktool工具-CSDN博客 Android 如何反编译APK获取源码_android studio apk反源码-CSDN博客

VBA技术资料MF169:移动工作表到另外的工作簿

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

Java - Execl自定义导入、导出

1.需求&#xff1a;问卷星答 下图框出区域&#xff0c;为用户自定义字段问题及答案 2.采用技术EasyExcel 模板所在位置如下 /*** 导出模板** param response*/ Override public void exportTemplate(HttpServletResponse response) throws IOException {ClassPathResource c…

uni-app移动端使用uni-file-picker上传图片时通过canvas添加拍摄时间等水印信息

实现效果&#xff1a; 添加的照片添加水印信息 实现方式&#xff1a; 将添加水印的方法抽离成组件&#xff0c;为Vue文件&#xff0c;方便复用&#xff0c;在父组件中直接引用即可实现水印效果。 子组件&#xff1a;waterMarker.vue 此为添加水印的组件文件&#xff0c;…

python-(opencv)视频转glf

文章目录 前言python-(opencv)视频转glf1. 下载 opencv-python2. cv2&#xff08;OpenCV&#xff09;和imageio的区别3. demo源码 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说…

YashanDB为新质生产力赋能 灌注合肥区域转型源动力

当前&#xff0c;数据要素已成为我国数字经济的“核心引擎”与“关键生产要素”&#xff0c;为全面激发数据要素的价值&#xff0c;各地区正积极探索数据要素交易平台的可行模式&#xff0c;加快在数据要素领域的布局。近日&#xff0c;深圳计算科学研究院崖山数据库系列产品受…