当前位置: 首页 > news >正文

Java转C之CMake

对于一位从 Java 转到 C 或 C++ 的工程师,理解 CMake 和其指令非常重要,因为 CMake 是目前 C/C++ 项目中最常用的构建工具。CMake 本质上是一个跨平台的自动化构建系统,它通过 CMakeLists.txt 文件来管理和配置项目的构建过程。在学习 CMake 的过程中,理解常用的 CMake 指令是非常关键的。

下面我会详细介绍 CMake 中常见的指令,并结合表格和解释帮助你更好地理解它们。

CMake 指令概述

CMake 指令大致可以分为以下几类:

  • 变量定义和赋值
  • 添加和管理源文件
  • 设置编译选项和链接
  • 指定目标和生成输出
  • 模块和文件操作

CMake 常用指令详解

1. set — 设置变量

用于定义一个变量,并赋予它一个值。

指令描述示例
set(VAR VALUE)设置一个变量 VAR 的值为 VALUEset(CMAKE_CXX_STANDARD 11)
set(VAR ${VAR} VALUE)将已有变量的值与新的值组合set(SOURCE_FILES main.cpp ${ADDITIONAL_SOURCES})
  • 用途
    • 用于设置项目、编译器、工具链等的变量。
    • 可以设置路径、文件列表、编译选项等。
2. add_executableadd_library — 添加目标
指令描述示例
add_executable(TARGET_NAME SOURCES...)创建一个可执行文件目标,并指定源文件。add_executable(my_program main.cpp)
add_library(TARGET_NAME TYPE SOURCES...)创建一个库目标,类型可以是 STATICSHAREDadd_library(my_library STATIC src/foo.cpp src/bar.cpp)
  • 用途
    • add_executable 用于添加一个可执行文件目标。
    • add_library 用于添加一个库文件目标(静态库或动态库)。
3. include_directories — 添加头文件路径

指定项目或目标的头文件搜索路径。

指令描述示例
include_directories(DIR...)设置 C++ 或 C 编译器的头文件搜索路径include_directories(${PROJECT_SOURCE_DIR}/include)
  • 用途
    • 将头文件路径添加到编译器的搜索路径中,使得源代码能够找到外部的头文件。
4. link_directories — 添加库路径

指定库文件的搜索路径。

指令描述示例
link_directories(DIR...)添加库文件搜索路径link_directories(${PROJECT_SOURCE_DIR}/lib)
  • 用途
    • 设置链接器查找库的路径,告诉链接器去哪里查找依赖的库文件。
5. target_link_libraries — 链接库文件

将库文件链接到目标(可执行文件或库)。

指令描述示例
target_link_libraries(TARGET LIBRARY...)将目标与库文件链接target_link_libraries(my_program my_library)
  • 用途
    • 指定某个目标(可执行文件或库)依赖于哪些库,链接这些库以便正确构建目标。
6. include — 引入外部 CMake 文件

引入外部的 CMake 配置文件。

指令描述示例
include(FILENAME)包含一个外部的 CMake 配置文件或模块include(${PROJECT_SOURCE_DIR}/cmake/config.cmake)
  • 用途
    • 引入外部的 CMake 配置文件,使得当前的构建脚本可以复用这些外部的配置和逻辑。
7. add_definitions — 添加编译器宏定义

为所有的源文件添加编译时宏定义。

指令描述示例
add_definitions(DEFINITION...)为编译器添加宏定义,影响所有的编译单元add_definitions(-DUSE_DEBUG)
  • 用途
    • 用于定义编译器的预处理宏,例如定义调试宏、配置宏等。
8. message — 输出信息

向控制台输出信息,常用于调试和输出状态信息。

指令描述示例
message([<mode>] "message")向终端输出信息,mode 用于指定消息的级别message(STATUS "Configuring my_project...")
  • 用途
    • 向控制台输出调试信息、警告信息或错误信息,mode 可以是 STATUSWARNINGERROR 等。
9. if / else / endif — 条件语句

用于在 CMake 文件中做条件判断。

指令描述示例
if(CONDITION)判断条件是否成立if(WIN32)
else()条件不成立时执行else()
endif()结束条件语句块endif()
  • 用途
    • 根据不同的条件执行不同的构建逻辑,可以在项目配置中做平台检测、编译选项配置等。
10. project — 设置项目名称和语言

用于定义项目的名称、版本及支持的编程语言。

指令描述示例
project(PROJECT_NAME [LANGUAGES])定义项目名称和支持的语言(如 C、C++)project(MyProject LANGUAGES C CXX)
  • 用途
    • 定义项目的名称,设置支持的编程语言(例如 C、C++ 等)。

CMake 语法规则总结

语法组件说明示例
变量定义使用 set() 来定义和设置变量。set(MY_VAR 10)
函数使用 function()endfunction() 来定义函数。function(my_function) ... endfunction
条件语句使用 if()else()endif() 来判断条件。if(WIN32) ... endif()
循环使用 foreach()endforeach() 来进行循环。foreach(file IN LISTS FILES) ... endforeach()
注释使用 # 来添加注释。# This is a comment

如何理解 CMake 中的指令

  • 变量和函数
    CMake 脚本本质上是一种声明式语言,它通过变量来存储值、路径、文件列表等信息。你可以使用 set() 来定义变量,使用 get() 来获取变量值。通过 function()macro() 来定义自定义的函数或宏,以简化配置过程。

  • 条件和逻辑
    if()else()elseif()endif() 等指令用于执行基于条件的操作,类似于其他编程语言中的条件语句。它们在配置中非常常用,用于判断平台、配置和编译选项。

  • 模块化构建
    使用 include() 来将模块化的 CMake 配置文件引入到主构建脚本中,方便代码复用。add_subdirectory() 用于包含子目录,这使得大项目的管理更加清晰。

  • 构建目标
    add_executable()add_library() 指令用来创建目标(可执行文件或库),并指定源文件。这是构建项目的核心步骤。

总结

CMake 是一个强大的工具,通过其指令可以灵活地配置 C 或 C++ 项目的构建过程。你可以定义变量、设置编译选项、添加目标、管理源文件、条件编译等等。对 Java 工程师而言,CMake 提供的构建管理方式类似于 Maven 或 Gradle,但它更侧重于底层的构建控制。理解这些指令

相关文章:

Java转C之CMake

对于一位从 Java 转到 C 或 C 的工程师&#xff0c;理解 CMake 和其指令非常重要&#xff0c;因为 CMake 是目前 C/C 项目中最常用的构建工具。CMake 本质上是一个跨平台的自动化构建系统&#xff0c;它通过 CMakeLists.txt 文件来管理和配置项目的构建过程。在学习 CMake 的过…...

如何自己创建database.js文件来初始化本地sqlite数据库

如何自己创建database.js文件来初始化本地sqlite数据库&#xff01;下面是一个案例展示&#xff0c;帮助大家&#xff0c;快速的视线&#xff0c;本地sqlite数据库信息初始化。 为了使用 database.js 文件初始化 SQLite 数据库并存储解签内容&#xff0c;你需要按以下步骤操作。…...

【汇编语言】内中断(三) —— 中断探险:从do0到特殊响应的奇妙旅程

文章目录 前言1. do01.1 do0程序1.2 存放字符串&#xff0c;得到完整的程序1.3 分析初步完成的程序1.4 正确的完整程序1.5 分析正确的完整程序 2. 设置中断向量3. 单步中断3.1 什么是单步中断&#xff1f;3.2 CPU为什么要提供单步中断3.2.1 思考一下Debug功能3.2.2 Debug是如何…...

0006.基于SpringBoot+element付费问答系统

适合初学同学练手项目&#xff0c;部署简单&#xff0c;代码简洁清晰&#xff1b; 愿世界和平再无bug 一、系统架构 前端&#xff1a;vue| elementui 后端&#xff1a;springboot | mybatis-plus 环境&#xff1a;jdk1.8 | mysql | maven 二、登录角色 1.管理员 2.用户 …...

SpringBoot feign基于HttpStatus重试

场景 基于springboot开发的项目&#xff0c;对接第三方&#xff0c;第三方的接口有限流策略&#xff0c;某个时间段内有调用频率限制&#xff0c;返回的状态码HttpStatus不是200&#xff0c;而HttpStatus是429。现基于HttpStatus我们发起的重试。 技术点 springbootfeign fe…...

【记录49】vue2 vue-office在线预览 docx、pdf、excel文档

vue2 在线预览 docx、pdf、excel文档 docx npm install vue-office/docx vue-demi0.14.6 指定版本 npm install vue-office/docx vue-demi <template><VueOfficeDocx :src"pdf" style"height: 100vh;" rendere"rendereHandler" error&…...

正则表达式中^的用法

正则表达式中^的用法 1.用法一: 限定开头 文档上给出了解释是匹配输入的开始&#xff0c;如果多行标示被设置成了true&#xff0c;同时会匹配后面紧跟的字符 比如 /^A/会匹配"An e"中的A&#xff0c;但是不会匹配"ab A"中的A 比如(\s|^)表示空字符串或字…...

WPF 关于界面UI菜单权限(或者任意控件的显示权限)的简单管理--只是简单简单简单简单

1.定义你的User类 public class User{public User(){ID ObjectId.NewObjectId().ToString();}public string? ID { get; set; }public string? Account { get; set; }public string? Password { get; set; }public string? PasswordMD5 { get; set; }public AccountType?…...

Https身份鉴权(小迪网络安全笔记~

附&#xff1a;完整笔记目录~ ps&#xff1a;本人小白&#xff0c;笔记均在个人理解基础上整理&#xff0c;若有错误欢迎指正&#xff01; 5.2 Https&身份鉴权 引子&#xff1a;上一篇主要对Http数据包结构、内容做了介绍&#xff0c;本篇则聊聊Https、身份鉴权等技术。 …...

AngularJS 输入验证

AngularJS 输入验证 AngularJS 是一个强大的 JavaScript 框架,它允许开发者构建动态的、高性能的 Web 应用程序。在处理用户输入时,确保数据的准确性和完整性至关重要。AngularJS 提供了一套内置的输入验证机制,可以帮助开发者轻松地实现这一目标。 为什么需要输入验证? …...

【网络安全】WIFI WPA/WPA2协议:深入解析与实践

WIFI WPA/WPA2协议&#xff1a;深入解析与实践 1. WPA/WPA2 协议 1.1 监听 Wi-Fi 流量 解析 WPA/WPA2 的第一步是监听 Wi-Fi 流量&#xff0c;捕获设备与接入点之间的 4 次握手数据。然而&#xff0c;设备通常不会频繁连接或重新连接&#xff0c;为了加速过程&#xff0c;攻…...

前端使用xlsx-js-style导出Excel,带样式,并处理合并单元格边框显示不全和动态插入表头解决

一、在学习之前&#xff0c;先给出一些学习/下载地址&#xff1a; xlsx-js-style下载地址 https://github.com/gitbrent/xlsx-js-style 或者 https://www.npmjs.com/package/xlsx-js-style SheetJS中文教程&#xff1a; https://xlsx.nodejs.cn/docs/csf/cell 二、先看样…...

自动化工具ansible部署和实践

1 介绍和部署 1.1 介绍 ansible的功能 我爱你在当今的IT自动化领域&#xff0c;Ansible无疑是一个无法被忽视的重要角色。其便利性和高效性受到了广大开发者和系统管理员的一致好评&#xff0c;成为了配置管理和应用部署的首选工具。然而&#xff0c;对于一些初学者来说&#…...

无人机推流直播平台EasyDSS视频技术如何助力冬季森林防火

冬季天干物燥&#xff0c;大风天气频繁&#xff0c;是森林火灾的高发期。相比传统的人力巡查&#xff0c;无人机具有更高的灵敏度和准确性&#xff0c;尤其在夜间或浓雾天气中&#xff0c;依然能有效地监测潜在火源。 无人机可以提供高空视角和实时图像传输&#xff0c;帮助巡…...

React Fiber

React Fiber 是 React 16 引入的全新重写的协调&#xff08;Reconciliation&#xff09;算法的实现&#xff0c;旨在改善 React 的更新机制和性能&#xff0c;尤其是在复杂应用和大量更新的场景下。它使得 React 更加灵活、可调度&#xff0c;能够实现优先级控制和中断更新等特…...

【前端】JavaScript 中的 map() 方法:高级解析与应用

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: 前端 文章目录 &#x1f4af;前言&#x1f4af;map() 方法的定义与核心特性1.1 方法定义1.2 主要特性 &#x1f4af;map() 方法的语法与高级用法2.1 基本语法2.2 简化写法与箭头函数2.3 结合链式操作 &#x1f4af;ma…...

《智能体开发实战(高阶)》四、系统化的日志周报智能体开发计划

智能体扩展与完善规划 为了将前几个章节的智能体逐步扩展为支持整个公司团队使用的高效工具,以下是分阶段的完善与扩写规划。每个阶段旨在提升功能覆盖范围、处理能力和用户体验,并为企业提供实际价值。 阶段一:基础功能完善 目标:巩固现有功能,提升健壮性和适用性。 支…...

什么是Apache日志?为什么Apache日志分析很重要?

Apache是全球最受欢迎的Web服务器软件&#xff0c;支持约30.2%的所有活跃网站。凭借其可靠性、灵活性和强大的功能&#xff0c;Apache数十年来一直是互联网的中坚力量。 一、Apache Web服务器的工作原理 Apache Web服务器的工作原理如下&#xff1a; 接收HTTP请求&#xff1…...

Mybatis——(2)

2.2 Mybatis 工具类&#xff08;了解&#xff09; 为了简化MyBatis的开发&#xff0c;可将MyBatis进一步封装。 import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apa…...

景联文科技入选中国信通院发布的“人工智能数据标注产业图谱”

近日&#xff0c;由中国信息通信研究院、中国人工智能产业发展联盟牵头&#xff0c;联合中国电信集团、沈阳市数据局、保定高新区等70多家单位编制完成并发布《人工智能数据标注产业图谱》。景联文科技作为人工智能产业关键环节的代表企业&#xff0c;入选图谱中技术服务板块。…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

JS手写代码篇----使用Promise封装AJAX请求

15、使用Promise封装AJAX请求 promise就有reject和resolve了&#xff0c;就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

Linux部署私有文件管理系统MinIO

最近需要用到一个文件管理服务&#xff0c;但是又不想花钱&#xff0c;所以就想着自己搭建一个&#xff0c;刚好我们用的一个开源框架已经集成了MinIO&#xff0c;所以就选了这个 我这边对文件服务性能要求不是太高&#xff0c;单机版就可以 安装非常简单&#xff0c;几个命令就…...