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

Linux下CMake入门

CMake的基础知识

  1. 什么是 CMake
  • CMake 是一个跨平台的构建工具,主要用于管理构建过程。CMake 不直接构建项目,而是生成特定平台上的构建系统(如 Unix 下的 Makefile,Windows 下的 Visual Studio 工程),然后通过这些构建系统来进行编译和链接
  1. CMake 的基本流程
    CMake 的工作流程通常如下:

    1. 编写 CMakeLists.txt 文件来定义项目的构建逻辑。
    2. 使用 cmake 命令生成构建文件(如 Makefile)。
    3. 运行生成的构建系统(如 make)来构建项目。
  2. 例子如下

    //一个简单的 C++ 项目,文件结构如下
    project/
    ├── CMakeLists.txt
    ├── main.cpp//main.cpp
    #include <iostream>int main() {std::cout << "Hello, CMake!" << std::endl;return 0;
    }//CMakeLists.txt
    cmake_minimum_required(VERSION 3.10)  # 设置最低 CMake 版本要求
    project(HelloCMake)                    # 定义项目名称set(CMAKE_CXX_STANDARD 11)             # 设置 C++ 标准
    add_executable(hello main.cpp)         # 定义生成的可执行文件
    • 构建步骤
      1. 创建构建目录并进入
    mkdir build
    cd build
     2. 运行 CMake 生成构建文件
    
    cmake ..
    # .. 指的是上一级目录(也称为父目录)。在运行 cmake 命令时,指定的是包含 CMakeLists.txt 文件的路径。
    
     3. 构建项目
    
    make
     4. 运行生成的可执行文件
    
    ./hello
    

    在这里插入图片描述

CMake 的基本指令

  1. cmake_minimum_required
# 指定 CMake 运行所需的最低版本,例如
cmake_minimum_required(VERSION 3.10)
  1. project
# 定义项目的名称和相关的语言
project(MyProject LANGUAGES C CXX)
  1. set
# 设置变量值。常用于设置编译选项、路径等
set(CMAKE_CXX_STANDARD 11)  # 设置 C++ 标准为 C++11
set(SOURCE_FILES main.cpp file1.cpp file2.cpp)  # 定义源文件列表
  1. add_executable
# 定义要生成的可执行文件。你需要给出目标名称和源文件列表
定义要生成的可执行文件。你需要给出目标名称和源文件列表
  1. add_library
# 用于生成静态或动态库
# 生成静态库
add_library(mylib STATIC file1.cpp file2.cpp)# 生成动态库
add_library(mylib SHARED file1.cpp file2.cpp)
  1. target_link_libraries
# 用于链接外部库或内部库
target_link_libraries(my_program mylib)  # 链接自定义库
target_link_libraries(my_program PUBLIC pthread)  # 链接系统库
  1. include_directories
# 为项目指定头文件目录
include_directories(/path/to/headers)

管理多个源文件和目录

举例说明

  1. 假设项目结构如下
project/
├── CMakeLists.txt
├── src/
│   ├── CMakeLists.txt
│   ├── main.cpp
│   ├── file1.cpp
│   ├── file2.cpp
└── include/└── file1.h└── file2.h
  1. 顶层 CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(MyProject)# 设置 C++ 标准
set(CMAKE_CXX_STANDARD 11)# 添加 include 目录
include_directories(${PROJECT_SOURCE_DIR}/include)# 递归处理 src 目录
add_subdirectory(src)
  1. src/CMakeLists.txt
# 定义源文件列表
set(SOURCE_FILES main.cpp file1.cpp file2.cpp)# 生成可执行文件
add_executable(my_program ${SOURCE_FILES})
  1. 构建项目
mkdir build
cd build
cmake ..
make

跨平台和编译器支持

CMake 的一个优势在于它能够支持多平台和多编译器。你可以通过 CMake 生成 Visual Studio、Xcode 工程文件,或者为其他平台生成 Makefile。

  1. 生成不同平台的构建文件
  • G关键字
# 生成 Unix Makefile(默认)
cmake ..# 生成 Visual Studio 工程
cmake -G "Visual Studio 16 2019" ..# 生成 Xcode 工程
cmake -G "Xcode" ..
  1. 支持多编译器(D)
# 可以通过 CMAKE_C_COMPILER 和 CMAKE_CXX_COMPILER 变量指定编译器
cmake -D CMAKE_C_COMPILER=gcc -D CMAKE_CXX_COMPILER=g++ ..

相关文章:

Linux下CMake入门

CMake的基础知识 什么是 CMake CMake 是一个跨平台的构建工具&#xff0c;主要用于管理构建过程。CMake 不直接构建项目&#xff0c;而是生成特定平台上的构建系统&#xff08;如 Unix 下的 Makefile&#xff0c;Windows 下的 Visual Studio 工程&#xff09;&#xff0c;然后…...

网络资源模板--Android Studio 实现简易记事本App

目录 一、项目演示 二、项目测试环境 三、项目详情 四、完整的项目源码 一、项目演示 网络资源模板--基于Android studio 实现的简易记事本App 二、项目测试环境 三、项目详情 首页 创建一个空的笔记本列表 mNotebookList。使用该列表和指定的布局资源 item_notebook 创建…...

根据Vue对比来深入学习React 下 props 组件传值 插槽 样式操作 hooks 高阶组件 性能优化

文章目录 函数组件的特点props组件间的传值父传子看上例子传父兄弟组件传值祖先组件传值 插槽基础插槽具名插槽作用域插槽 样式操作**CSS Modules** 生命周期useRef常用hookuseStateuseEffectuseContextuseReduceruseMemouseCallback 高阶组件什么时候使用 react性能问题和优化…...

HTML(六)超链接

HTML讲解&#xff08;一&#xff09;body部分_html body-CSDN博客 <!DOCTYPE html> <html><head><meta charset"UTF-8" /><title>title</title> </head><body><a href"https://blog.csdn.net/2301_8034953…...

【Coroutines】Implement Lua Coroutine by Kotlin - 2

Last Chapter Link 文章目录 Symmetric CoroutinesNon-Symmetric Coroutine SampleSymmetric Coroutine SampleHow to Implement Symmetric CoroutinesWonderful TricksCode DesignTail Recursion OptimizationFull Sources Symmetric Coroutines in last blog, we have talk…...

java计算机毕设课设—扫雷游戏(附源码、文章、相关截图、部署视频)

这是什么系统&#xff1f; 资源获取方式再最下方&#xff08;本次10月份活动福利&#xff0c;免费提供下载&#xff0c;自行到对应的方式1下载&#xff0c;csdn的0积分下载&#xff09; java计算机毕设课设—扫雷游戏(附源码、文章、相关截图、部署视频) 基于Java的扫雷游戏…...

AndroidLogger 使用问题

Q1&#xff1a;解压zip后&#xff0c;启动Notepad未看到AndroidLogger工具栏 请检查plugins下安装位置是否正确&#xff0c;必须与下图一致&#xff0c;再确认Notepad 是否为 x64 &#xff1f; Q2&#xff1a;使用 adb 可以显示已连接&#xff0c;但是获取不到日志 暂时不确定问…...

数据库常见面试

8道面试题 目录 目录 7道面试题 1.怎样进行sql优化 4、group by优化 5、limit优化 6、count优化 7、update优化 2.。怎样查看sql执行情况呢(哪个关键字)&#xff0c;说说你对这个关键字的认识 4) possible_key&#xff1a; 5) key 3.说说你对innodb和 myisam的理解 …...

boxplot 绘制箱线图,添加数据点

先看效果图 import matplotlib.pyplot as plt #! 解决不显示的问题&#xff1a;中文设置为宋体格式 plt.rcParams[font.family] ["Times New Roman", SimSun]def plot_boxplot(data_list, out_file, x_custom_labels):# 画图fig, ax plt.subplots(figsize(90, 6…...

用sdkman管理多个jdk切换

前言 最近项目前后端进行升级&#xff0c;需要在jdk8和jdk17两个版本切换。最简单的是通过手动切换&#xff0c;但切换过程太繁琐&#xff0c;修改环境变量&#xff0c;达到切换目的。于是尝试其它解决方案&#xff0c;最终确实使用sdkman工具。 sdkman 是一款面向Java开发者的…...

【AIGC】ChatGPT提示词Prompt高效编写模式:结构化Prompt、提示词生成器与单样本/少样本提示

&#x1f4af;前言 在如今AI技术迅猛发展的背景下&#xff0c;尽管像ChatGPT这样的大型语言模型具备强大的生成能力&#xff0c;但它们的输出质量有时仍难以完全满足我们的预期。为了让ChatGPT生成更加准确、可靠的内容&#xff0c;掌握高效的Prompt编写技巧变得尤为重要。本文…...

反调式实战(有道翻译窗口弹出)

1.添加脚本断点实现源码获取 2.Function构造器构造debugger 因为是窗口被弹出的情况&#xff0c;所以window.closefunction()构造debugger。 3.定位到影响弹出的JavaScript代码片段 反调试思想&#xff1a;置空和替换&#xff0c;所以将其JavaScript进行注释或者删除。 这里主…...

verilog端口使用注意事项

下图存在组合逻辑反馈环&#xff0c;即组合逻辑的输出反馈到输入(赋值的左右2边存在相同的信号)&#xff0c;此种情况会造成系统不稳定。比如在data_in20的情况下&#xff0c;在data_out0 时候&#xff0c;输出的数据会反馈到输入&#xff0c;输入再输出&#xff0c;从而造成不…...

Docker常用命令大全汇总

Docker是一种流行的容器化平台,可以在一个独立的、隔离的环境中构建、部署和运行应用程序。了解Docker常用命令可以帮助我们更高效地管理容器,快速开发和部署应用。本文将整理一系列Docker的常用命令,便于日常使用和学习。 1 Docker基础命令 1.1 启动/停止/重启docker # …...

LVS-DR+Keepalived 高可用群集部署

LVS-DRKeepalived 高可用群集部署 Keepalived 的工作原理LVSKeepalived 高可用群集部署配置负载调度器&#xff08;主、备相同&#xff09;关闭防火墙和核心防护及准备IPVS模块配置keeplived&#xff08;主、备DR 服务器上都要设置&#xff09;启动 ipvsadm 服务调整 proc 响应…...

【elasticsearch】安装和启动

启动 Elasticsearch 并验证其是否成功运行通常涉及以下步骤&#xff1a; 下载和安装 Elasticsearch&#xff1a; 访问 Elasticsearch 官方网站下载页面&#xff1a;https://www.elastic.co/guide/en/elasticsearch/reference/current/install-elasticsearch.html根据你的操作系…...

Golang 逃逸分析(Escape Analysis)理解与实践篇

Golang 逃逸分析&#xff08;Escape Analysis&#xff09;理解与实践篇 文章目录 1.逃逸分析2.相关知识&#xff08;栈、堆、GC分析&#xff09;3.逃逸分析综合-实践 demo 逃逸分析&#xff08;Escape Analysis&#xff09;是编译器在编译期进行的一项优化技术&#xff0c;是Gl…...

React入门 9:React Router

1. 什么是路由 路由&#xff08;routing&#xff09;就是通过互联的网络把信息从源地址传输到目的地址的活动。 以上是中文维基百科对路由的解释。通俗的来讲&#xff0c;把一个地方的信息传输到他想去的目的地的过程&#xff0c;就叫路由。 2. 用代码解释路由 需求&#xff1a…...

MATLAB基础应用精讲-【数模应用】Bland-Altman图(附python和R语言代码实现)

目录 前言 几个高频面试题目 Bland-altman图:如何改变y轴 算法原理 Bland-Altman一致性分析 一致性界限 1. 背景介绍 2. Bland-Altman 法 3. batplot 命令介绍 4. 应用实例 Prism GraphPad实现Bland-Altman图 1.输入数据 2.从数据表中选择Bland-Altman分析 3.检…...

ARM/Linux嵌入式面经(四一):中兴面经

1. 请介绍一下您在嵌入式系统开发中的项目经验。 在嵌入式系统开发领域,我积累了丰富的项目经验,这些经验不仅锻炼了我的技术能力,也让我对嵌入式系统的设计和实现有了更深入的理解。以下是我参与的一个具有代表性的嵌入式系统开发项目的详细介绍: 项目背景 该项目是为一…...

观察使用Taotoken Token Plan套餐后月度API成本的变化趋势

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 观察使用Taotoken Token Plan套餐后月度API成本的变化趋势 对于个人开发者或小型团队而言&#xff0c;在项目开发中持续使用大模型…...

Office RibbonX Editor:免费开源Office界面定制终极指南

Office RibbonX Editor&#xff1a;免费开源Office界面定制终极指南 【免费下载链接】office-ribbonx-editor An overhauled fork of the original Custom UI Editor for Microsoft Office, built with WPF 项目地址: https://gitcode.com/gh_mirrors/of/office-ribbonx-edit…...

别再手动画UML了!用IDEA Diagrams插件自动生成类关系图,附赠符号含义速查表

高效架构可视化&#xff1a;IDEA Diagrams插件全指南与UML符号解析 在软件开发过程中&#xff0c;清晰的架构设计是团队协作和代码维护的基石。传统的手绘UML类图不仅耗时费力&#xff0c;更难以与快速迭代的代码保持同步。JetBrains IDEA内置的Diagrams插件正是为解决这一痛点…...

系统提示词工程:构建稳定可控的大语言模型应用实践

1. 项目概述与核心价值 最近在GitHub上看到一个挺有意思的项目&#xff0c;叫 edoardoavenia/chatgpt-system-prompts 。乍一看&#xff0c;这似乎又是一个收集ChatGPT提示词的仓库&#xff0c;但当你真正点进去&#xff0c;花点时间研究一下它的结构和内容&#xff0c;你会发…...

Wwise与Godot音频集成:专业游戏音频中间件在开源引擎中的实现

1. 项目概述&#xff1a;连接两大巨头的桥梁如果你是一位游戏音频设计师&#xff0c;或者是一位对游戏音频实现有追求的开发者&#xff0c;那么“Wwise”和“Godot”这两个名字对你来说一定不陌生。Wwise是业界顶级的交互式音频中间件&#xff0c;以其强大的音频逻辑编排、动态…...

基于MCP协议构建AI助手用户反馈闭环:从原理到工程实践

1. 项目概述&#xff1a;一个为AI助手“装”上用户反馈的桥梁最近在折腾AI应用开发&#xff0c;特别是想让大语言模型&#xff08;LLM&#xff09;驱动的助手能更“懂”用户。一个核心痛点出现了&#xff1a;助手处理完用户请求后&#xff0c;如何让用户方便地给出“好评”或“…...

CircuitPython硬件编程在Linux单板机上的实现:以ODROID C2为例

1. 项目概述&#xff1a;当CircuitPython遇见Linux单板机如果你玩过树莓派Pico或者Adafruit的Feather开发板&#xff0c;肯定对CircuitPython不陌生。它让Python跑在了微控制器上&#xff0c;用几行代码就能点亮LED、读取传感器&#xff0c;对硬件新手和快速原型开发来说&#…...

抓到涨停后的“财富密码”:次日去留的5条离场铁律

引言&#xff1a;涨停之后的焦虑与狂欢在股市里&#xff0c;最让散户热血沸腾也最揪心的时刻&#xff0c;莫过于抓到一个涨停板。那种追涨进去、刚吃两三个点就封死涨停的兴奋感&#xff0c;往往转瞬就会被对次日的恐惧所取代。很多投资者在涨停次日常常陷入纠结&#xff1a;走…...

手把手教你用TI TICS Pro配置LMX2594时钟芯片(附寄存器导出与SPI写入指南)

手把手教你用TI TICS Pro配置LMX2594时钟芯片&#xff08;附寄存器导出与SPI写入指南&#xff09; 在高速数字系统设计中&#xff0c;时钟信号的稳定性和精确度往往决定着整个系统的性能上限。作为射频与通信领域的工程师&#xff0c;我深刻体会过时钟配置失误带来的调试噩梦—…...

Zabbix监控扩展实战:zbx-openclaw开源模板深度解析与应用指南

1. 项目概述与核心价值最近在折腾监控告警系统&#xff0c;发现一个挺有意思的开源项目&#xff0c;叫zbx-openclaw。这名字乍一看有点抽象&#xff0c;但拆开来看就明白了——zbx指的是 Zabbix&#xff0c;那个老牌的监控系统&#xff1b;openclaw直译是“开放的爪子”&#x…...