cmake命令使用

news2024/10/28 2:01:40

有关cmake的入门简介可参见

CMake入门教程_cmake静态test.c编译-CSDN博客

本文是进一步对cmake常用命令做进一步详述

配置项目

cmake_minimum_required

作用

配置cmake最低版本

用法

cmake_minimum_required(VERSION 3.0)

project

作用:设置预设变量

  • PROJECT_NAME
  • PROJECT_SOURCE_DIR
  • ROJECT_BINARY_DIR

用法

project(demo_project c cxx)

其中,后边的c和cxx用于设置编译的语言,一般可以不用

案例:创建CMakeLists.txt,编写该文件内容,使用project命令设置项目名称,然后打印上述预设变量

cmake_minimum_required(VERSION 3.0)
project(demo_project)
#打印预设变量
message(STATUS "PROJECT_NAME:${PROJECT_NAME}")
message(STATUS "PROJECT_SOURCE_DIR:${PROJECT_SOURCE_DIR}")
message(STATUS "PROJECT_BINARY_DIR:${PROJECT_BINARY_DIR}")

保存退出后,使用下述命令编译cmake

cmake -S . -B build
  • -S选项表示指定CMakeLists.txt文件的目录文件,后边的.表示当前目录
  • -B选项表示指定生成的文件存放在哪里

因此上述命令表示使用当前目录下的 CMakeLists.txt 生成Makefile文件等文件,并将生成的文件放到build文件夹内(注意build文件夹需要首先创建好)

运行结果

信息打印

上述命令中message函数可以帮助我们打印相关信息,如

message(STATUS "This is a status message.")
message(WARNING "This is a warning message.")
message(FATAL_ERROR "This is a fatal error message.")
  • STATUS:打印一般信息,输出为绿色。
  • WARNING:打印警告信息,输出为黄色。
  • FATAL_ERROR:打印错误信息并停止配置过程。

 同时可以设置 CMake 的调试输出,可以在命令行中设置 CMAKE_VERBOSE_MAKEFILE 变量,以显示详细的构建命令。例如:

cmake -S . -B build -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON

这将使 CMake 在执行构建时打印每个命令的详细信息。

添加头文件目录

添加头文件搜索路径的命令有两种

  • include_directories:指定的头文件路径会被应用于整个 CMakeLists 文件中所有后续的目标
  • target_include_directories:允许你为特定的目标(例如库或可执行文件)设置头文件路径

 以下是两种方式使用代码实例

include_directories(${PROJECT_SOURCE_DIR}/include)

该代码表示整个项目所有源文件的自定义头文件搜索路径都指定为include 

add_executable(app main.cc)
target_include_directories(app PRIVATE ${PROJECT_SOURCE_DIR}/include)

而该代码表示仅为目标文件app中包含的自定义头文件搜索路径指定为include

target_include_directories命令的语法格式为

target_include_directories(<target> <INTERFACE|PUBLIC|PRIVATE> <directory1> <directory2> ...)

 如上所示,该命令会为指定的头文件添加三个属性

  • INTERFACE
  • PUBLIC
  • PRIVATE

要理解上述三个属性的区别,首先要知道,Cmake会为每个目标文件设置两个属性,分别是

  • INCLUDE_DIRECTORIES:只在当前目标文件中有效
  • INTERFACE_INCLUDE_DIRECTORIES:随着目标文件的依赖而传播

上述两个属性的区别在于:

  • 如果使用PRIVATE,则只会在INCLUDE_DIRECTORIES属性中添加头文件搜索路径
  • 如果使用INTERFACE,则只会在INTERFACE_INCLUDE_DIRECTORIES属性中添加头文件搜索路径
  • 如果使用PUBLIC,则相当于同时使用INCLUDE_DIRECTORIES和INTERFACE_INCLUDE_DIRECTORIES

 如下所示,如果使用PRIVATE,则每个目标文件(在这里是base和app)的头文件的搜索路径包含在各自维护的INCLUDE_DIRECTORIES变量里 

add_library(base base/base.cc)
target_include_directories(base PRIVATE ${PROJECT_SOURCE_DIR}/util)

add_executable(app base)
target_include_directories(app 
PRIVATE ${PROJECT_SOURCE_DIR}/base
PRIVATE ${PROJECT_SOURCE_DIR}/util
)

但是如果使用的是PUBLIC,那么util的路径就会被同时存储在INTERFACE_INCLUDE_DIRECTORIES变量里,同时这个路径会跟随base这个目标文件存在,因此当第二个target_include_directories包含base的时候,base就已经包含了util路径,将不再需要单独列出这个路径了

add_library(base base/base.cc)
target_include_directories(base PUBLIC ${PROJECT_SOURCE_DIR}/util)

add_executable(app base)
target_include_directories(app 
PRIVATE ${PROJECT_SOURCE_DIR}/base
)

 编译可执行程序

添加可执行程序的命令为

add_executable(app main.cc)
add_executable(app2 EXCLUDE_FROM_ALL main.cc)

app为最后编译成功的可执行程序,main.cc表示编译这个可执行程序需要的源文件,而可选项EXCLUDE_FROM_ALL 表示将可执行程序app2排除在all之外,需要明确指定才能编译

EXCLUDE_FROM_ALL 这个可选项什么意思呢?

我们在CMakeLists.txt文件中写入以下内容

cmake_minimum_required(VERSION 3.0)
project(demo_project)

add_executable(app main.cc)
add_executable(app2 EXCLUDE_FROM_ALL main.cc)

然后执行

cmake -S . -B build

首先进入build文件夹

先执行

make

可以看到,此时使用make,仅仅只编译了app,并未编译app2 

事实上,make命令其实执行的是make all

接下来我们重新执行

make app2

可以看到,由于EXCLUDE_FROM_ALL 的作用,我们在使用make命令编译时,必须手动指明要编译的目标文件名

 库文件编译

如果要编译库文件,则使用的命令是

add_library(<name>[STATICSHAREDMODULE]
[EXCLUDE FROM ALL][<source>...])

其使用方式与add_executable一样,只是库文件有静态库和动态库之分,因此add_library命令有一个可选项用于指定编译动态库还是静态库,默认情况下不指定选项时编译为静态库

add_library(mprpc mprpcapplication.cpp)

如上述命令表示将   mprpcapplication.cpp文件编译为静态库

而如果要编译为动态库,则需要指定为

add_library(mprpc SHARED mprpcapplication.cpp)

引用库文件

引用库文件时使用命令

target_link_libraries

比如以下命令,表示我要编译生成一个静态库文件mprpc,而这个库文件在编译时要依赖于其他的第三方库,这是就需要使用target_link_libraries命令

add_library(mprpc ${SRC_LIST})
 target_link_libraries(mprpc muduo_net muduo_base pthread zookeeper_mt)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

w002基于Springboot医护人员排班系统

&#x1f64a;作者简介&#xff1a;多年一线开发工作经验&#xff0c;原创团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339;赠送计算机毕业设计600个选题excel文…

Python数据分析基础

本文介绍了Python在数据分析中的应用&#xff0c;包括数据读取、清洗、处理和分析的基本操作。通过使用Pandas和Numpy库&#xff0c;我们可以高效地处理大量数据&#xff0c;并利用Matplotlib和Seaborn库进行数据可视化。 1. 引言 Python因其简洁的语法和强大的库支持&#x…

重学SpringBoot3-Spring WebFlux之Reactor事件感知 API

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ Spring WebFlux之Reactor事件感知 API 1. 什么是 doOnXxx 系列 API&#xff1f;2. doOnXxx API 的常用方法2.1 doOnNext()示例&#xff1a;输出&#xff1a; 2.2 doOnErr…

OCR经典神经网络(三)LayoutLM v2算法原理及其在发票数据集上的应用(NER及RE)

OCR经典神经网络(三)LayoutLM v2算法原理及其在发票数据集上的应用(NER及RE) LayoutLM系列模型是微软发布的、文档理解多模态基础模型领域最重要和有代表性的工作&#xff1a; LayoutLM v2&#xff1a;在一个单一的多模态框架中对文本&#xff08;text&#xff09;、布局&…

OpenAI GPT-o1实现方案记录与梳理

本篇文章用于记录从各处收集到的o1复现方案的推测以及介绍 目录 Journey Learning - 上海交通大学NYUMBZUAIGAIRCore IdeaKey QuestionsKey TechnologiesTrainingInference A Tutorial on LLM Reasoning: Relevant methods behind ChatGPT o1 - UCL汪军教授Core Idea先导自回归…

anaconda 创建环境失败 解决指南

anaconda 创建环境失败 解决指南 一、问题描述 我在宿舍有一台电脑。由于我经常泡在实验室&#xff0c;所以那台电脑不是经常用&#xff0c;基本吃灰。昨天晚上突然有在那台电脑上使用Camel-AI部署多智能体协同需求&#xff0c;便戳开了电脑&#xff0c;问题也随之而来。 当…

开源实时数仓的构建

设计计思路 基本思路 开源数据平台的设计思路是通过 Flink SQL Batch、StartRocks SQL 、StartRocks物化视图 的能力实现一个离线任务的开发&#xff1b;使用 DolphinScheduler 进行离线工作流编排和调度&#xff1b;通过 Flink CDC 和 Flink SQL 实现流处理能力&#xff0c;进…

【自然语言处理】BERT模型

BERT&#xff1a;Bidirectional Encoder Representations from Transformers BERT 是 Google 于 2018 年提出的 自然语言处理&#xff08;NLP&#xff09;模型&#xff0c;它基于 Transformer 架构的 Encoder 部分。BERT 的出现极大提升了 NLP 任务的性能&#xff0c;如问答系…

Linux基础知识 - C(自学使用)

1.C语言基础知识 参考博客&#xff1a; https://blog.csdn.net/qq_45254369/article/details/126023482?ops_request_misc%257B%2522request%255Fid%2522%253A%252277629891-A0F3-4EFC-B1AC-410093596085%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%…

【Canvas与图标】六色彩虹圆角六边形图标

【成图】 120*120的png图标 以下是各种大小图&#xff1a; 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>六色彩虹圆角六边形…

Android简单控件实现简易计算器

学了一些Android的简单控件&#xff0c;用这些布局和控件&#xff0c;设计并实现一个简单计算器。 计算器的界面分为两大部分&#xff0c;第一部分是上方的计算表达式&#xff0c;既包括用户的按键输入&#xff0c;也包括计算结果 数字&#xff1b;第二部分是下方的各个按键&a…

1U服务器和Hyper-V虚拟机使用记录

记录最近接触服务器和虚拟机的一些使用操作知识 背景&#xff1a;1U服务器上架使用&#xff0c;备份其他服务器vm虚拟机&#xff0c;Hyper-V管理虚拟机使用测试 设备&#xff1a;IBM3550服务器交换机&#xff0c; 移动硬盘&#xff1a;附加存储盘&#xff0c; u盘1&#xff1…

在虚拟化环境中,虚拟机的资源分配是否真的能够完全等效于物理服务器?是否有某些特定的工作负载在虚拟化环境中始终无法达到理想表现?

目录 1. 虚拟化技术的基本原理与资源管理 2. 资源分配的等效性问题 3. 特定工作负载在虚拟化环境中的表现 4. 性能优化与虚拟化环境的选择 5. 结论 虚拟化技术的广泛应用为数据中心的资源管理与部署带来了革命性的变化。虚拟机&#xff08;VM&#xff09;通过抽象化的方式…

【了解一下静态代理与动态代理】

文章目录 一.什么是静态代理与动态代理二.静态代理三.动态代理1.jdk动态代理2.cglib动态代理 四.小结 一.什么是静态代理与动态代理 什么是代理&#xff1f;代理是一种设计模式&#xff0c;在这种模式中&#xff0c;一个类&#xff08;代理类&#xff09;代表另一个类&#xff…

【ArcGIS Pro实操第8期】绘制WRF三层嵌套区域

【ArcGIS Pro实操第8期】绘制WRF三层嵌套区域 数据准备ArcGIS Pro绘制WRF三层嵌套区域Map-绘制三层嵌套区域更改ArcMap地图的默认显示方向指定数据框范围 Map绘制研究区Layout-布局出图 参考 本博客基于ArcGIS Pro绘制WRF三层嵌套区域&#xff0c;具体实现图形参考下图&#xf…

cloak斗篷伪装下的独立站

随着互联网的不断进步&#xff0c;越来越多的跨境电商卖家开始认识到独立站的重要性&#xff0c;并纷纷建立自己的独立站点。对于那些有志于进入这一领域的卖家来说&#xff0c;独立站是什么呢&#xff1f;独立站是指个人或小型团队自行搭建和运营的网站。 独立站能够帮助跨境…

C++ 模板编程:解锁高效编程的神秘密码

快来参与讨论&#x1f4ac;&#xff0c;点赞&#x1f44d;、收藏⭐、分享&#x1f4e4;&#xff0c;共创活力社区。 目录 &#x1f4af;前言 &#x1f4af;泛型编程 &#x1f4af;函数模板 1.函数模板概念 2.函数模板格式 3.函数模板的原理 4.函数模板的实例化 5.模板参…

如何使用DBeaver连接flink

通过DBeaver配置并连接flink&#xff1a; 1. 打开Dbeaver&#xff0c;选择“数据库”--》“数据库驱动管理器” 2.在驱动管理器界面点击新建按钮 3.在新建弹窗输入flink相关的驱动信息&#xff0c;主要包括&#xff1a; org.apache.flink.table.jdbc.FlinkDriver jdbc:flink…

Spring+ActiveMQ

1. 环境搭建 1.1 env-version JDK 1.8 Spring 2.7.13 Maven 3.6 ActiveMQ 5.15.2 1.2 docker-compose.yml version: 3.8services:activemq:image: rmohr/activemq:5.16.3container_name: activemqports:- "61616:61616"- "8161:8161"environment…

图解:什么是多租户?

大家好&#xff0c;我是汤师爷~ 什么是多租户&#xff1f; 多租户是SaaS&#xff08;软件即服务&#xff09;领域里特有的一个概念。在SaaS服务中&#xff0c;“租户”指的就是使用这个SaaS系统的客户。 那么租户和用户有什么区别呢&#xff1f;举个例子。假设你正在使用一款…