关于Cmake与CmakeLists(一)--背景,须知,示例

2023-05-16

一.背景及须知

1.背景:    VS2019与VS2010在编写程序时都是创建了一个工程,然后直接打开.sln即可
                 但是vscode仅仅是一个编辑器,打开之后只有.c或者.cpp文件,故需要手动编译链接

2.名词解释:
Makefile与CMakeLists.txt:
Makefile文件描述了整个工程的编译、链接等规则。包括:工程中的哪些源文件需要编译以及如何编译、需要创建哪些库文件以及如何创建这些库文件、如何最后产生我们想要的可执行文件。
CMakeLists.txt:但由于Makefile文件的语法很繁琐,故采用CMAKE工具,通过编写CMakeLists.txt,使用CMAKE工具读取CMakeLists.txt来自动生成对应的Makefile文件


CMAKE与make工具
make工具是一个命令工具,是一个解释makefile中指令并运行相应指令的工具。
CMAKE工具是一个编译打包工具,通过读取CMakeLists.txt来生成Makefile或project文件
(Makefile文件在vscode中是红色的M图标,CMakeLists.txt是蓝色的M图标)

archive    静态库
library    动态库
runtime    可执行二进制文件


3.安装相应工具
apt install g++        vscode上安装扩展:CMake,CMake Tools
apt install cmake
apt install make


4.构建build目录
通常采用外部构建的方式执行cmake
即新建一个文件夹build,cd build ,cmake ..,将临时文件存放在指定的目录下,避免污染工程

5.CmakeLists命令通用注意事项:                                 
command(<target> [E] <A|B|C>)  
尖括号<>    表示必选项,必须填写的变量
方括号[ ]      表示可选项,选填的变量
竖线 |        表示或的意思,即内部填写A或者B或者C

cmake的内置命令是不区分大小写的    add_subdirectory与ADD_SUBDIRECTORY作用一致。
cmake的所有变量都是区分大小写的

二.基础示例


1.仅一个test.cpp文件
cmake_minimum_required(VERSION 3.9)     # 指定运行此配置文件所需的 CMake 的最低版本   
project(HelloWorld)                       # 指定项目的名称, 
set(CMAKE_CXX_STANDARD 11)              # 把编译选项设置为了C++ 11   
add_executable(HelloWorld test.cpp)     # 将名为 main.cpp 的源文件编译成名称为 HelloWorld 的可执行文件  

2.单层级目录结构
当目录结构为如下时
/test                    //工程名字  
——/src                   //一级目录
————test.cpp             //源文件
————CMakeLists.txt      //CMakeLists.txt
——CMakeLists.txt        //CMakeLists.txt

外层CmakeLists.txt
cmake_minimum_required(VERSION 3.9)         # 指定运行此配置文件所需的 CMake 的最低版本   
project(HelloWorld)                         # 指定项目的名称, 
set(CMAKE_CXX_STANDARD 11)                  # 把编译选项设置为了C++ 11   
# add_executable(HelloWorld test.cpp)       # 将名为 main.cpp 的源文件编译成名称为 HelloWorld 的可执行文件  
add_subdirectory(src)                       # 向子目录添加CMakeLists.txt,即构建时添加子目录的CMakeLists.txt
                                            # add_subdirectory(source_dir [binary_dir]) []代表可选项,src代表包含src的子目录中的CMakeLists.txt
                                            # binary_dir代表子目录生成的中间文件存放位置,不填写的话默认在build目录下创建一个src文件夹,在内部存储

内层CmakeLists.txt
cmake_minimum_required(VERSION 3.9)         # 指定运行此配置文件所需的 CMake 的最低版本   
set(CMAKE_CXX_STANDARD 11)   
aux_source_directory(. source_list)         #获取当前位置的全部源文件(.c与.cpp文件),并把名字存在source_list变量内
add_executable(HelloWorld ${source_list})   #使用全部的源文件构建一个名字叫HelloWorld的工程
# set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/../bin/)   #将生成的可执行文件存放在上一级即build同级的bin文件夹下,一般不需要

3.多层级目录结构目录结构
/hello                    c_cpp_properties.json中的“includePath”:添加一下"${workspaceFolder}/test/inc"
——/test                理论上本来是不用的,有"${workspaceFolder}/**"递归查询全部子目录,不知道为什么编译能通过,文件能生成,但会标红报错
————/inc
——————test.h
————/src
——————test.cpp
————CMakeLists.txt
——/CMakeLists.txt

外部CMakeLists.txt没变
cmake_minimum_required(VERSION 3.9)         # 指定运行此配置文件所需的 CMake 的最低版本   
project(HelloWorld)                         # 指定项目的名称, 
set(CMAKE_CXX_STANDARD 11)                  # 把编译选项设置为了C++ 11   
# add_executable(HelloWorld test.cpp)       # 将名为 main.cpp 的源文件编译成名称为 HelloWorld 的可执行文件  
add_subdirectory(test)                       # 向子目录添加CMakeLists.txt,即构建时添加子目录的CMakeLists.txt
                                            
内部CMakeLists.txt增加一个include_directories

cmake_minimum_required(VERSION 3.9)         # 指定运行此配置文件所需的 CMake 的最低版本   
set(CMAKE_CXX_STANDARD 11)   
aux_source_directory(./src source_list)         #获取当前位置的全部源文件(.c与.cpp文件),并把名字存在source_list变量内

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/inc)    //两种方法,包含当前目录的子目录/inc内的头文件
# include_directories(${CMAKE_SOURCE_DIR}/test/inc)        //包含资源文件的子目录test的子目录inc内的头文件

add_executable(HelloWorld ${source_list})   #使用全部的源文件构建一个名字叫HelloWorld的工程

# set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/../bin/)   #将生成的可执行文件存放在上一级即build同级的bin文件夹下,一般不需要

补充:建议使用target_include_directories,避免如果有不同目录相同名称的头文件会产生影响
include_directories(dir)
target_include_directories(<target>, <INTERFACE|PUBLIC|PRIVATE>,dir)
例子:target_include_directories(${PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../../include)
  

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于Cmake与CmakeLists(一)--背景,须知,示例 的相关文章

随机推荐

  • 在STM32上对EV1527等无线编码格式的C程序编码实现

    测调 西安 老雷子 2020年6月1日 软件平台 WINDOWS Keil uVision STM32 ST LINK 硬件平台 STM32S108C8B6 通用32开发板调试 发射端 xff1a 蜂鸟远T1 输入需要用MCU进行编码 xf
  • 机器人手眼标定快速精度验证方法

    一 原理及流程 机器人的手眼标定原理在本文中不再过多描述 xff0c 基本流程都是先标定相机的内外参数 xff0c 然后标定两台相机之间的位置关系 xff0c 如果相机是可以转动的话 xff0c 还要标定转台与机械臂之间的关系 在手眼标定完
  • 【转载】写给电子信息工程专业的毕业生(一)

    一 继续深造 VS 找工作 在就业竞争异常激烈的今天 xff0c 也许大家大三起就开始忧心自己毕业后该何去何从了 摆在大家面前最为清晰的 xff0c 是两条路 xff1a 继续深造 xff08 考研 留学 xff09 和找工作 现在研究生扩
  • 通过python的百度云客户端可以把linux数据备份到百度云

    引言 网站备份真的很重要 xff0c 前段时间已经被坑过一次了 xff0c 幸好数据没有完全丢 xff0c 勉强恢复了 xff0c 虽然丢失了几篇文章 之前一直是每隔几天手动备份一下重要的数据 xff0c 然后下载到本地 但是有时候会忘记备
  • XCOM2.0接收数据为0

    新装系统后 xff0c 串口助手Xcom2 0版本 xff0c 使用FT232接受到的数据全是0 xff0c FT232已经有驱动 xff0c 经过多出测试 xff0c 需要更新FTDI的官网驱动 xff0c 并重启 xff0c 问题解决
  • PyQt(Python+Qt)学习随笔:Action功能详解及Designer中的操作方法

    老猿Python博文目录老猿Python博客地址 一 引言 Qt Designer中的部件栏并没Action相关的部件 xff0c Action可以在右侧的Action Editor中编辑 xff0c 如图 xff1a 如果没有出现Acti
  • 鸿蒙最新功能及承载设备详解:HarmonyOS 2及华为全场景新品发布会全纪录

    6月2日 xff0c 华为联手CSDN直播了 HarmonyOS 2及华为全场景新品发布会 xff0c 老猿全程观看直播 xff0c 并进行了回看 xff0c 力争将发布会的核心内容在本文中概要性地呈现 一 一生万物 万物归一 首先是华为消
  • 构建VisualStudio2019+OpenCV4.3的C++ windows编译环境

    一 引言 最近在读源代码研究CLAHE的算法 xff0c 但好久没学习C 43 43 了 xff0c 发现部分代码难以理解 xff0c 因此最后下决心装一个C 43 43 编译器 下载OpenCV源码 xff0c 这样碰到疑难问题就可以实际
  • 关于C++集合操作赋值和集合间操作的结果集合的疑问

    一 关于集合的疑问 最近对C 43 43 语言的集合操作比较感兴趣 xff0c 看了好友博主CP猫介绍的 C 43 43 中集合set的常用操作 xff0c 在使用时有3个疑问 xff1a 集合的变量赋值能否直接将一个集合实例赋值个另一个集
  • 如何使用Docker暴露多个端口?

    本文翻译自 xff1a How can I expose more than 1 port with Docker So I have 3 ports that should be exposed to the machine 39 s i
  • 人工智能基础概念1:模型、拟合、最大似然估计、似然函数、线性回归、sigmoid函数、逻辑回归

    一 模型 拟合 xff08 fitting xff09 和过拟合 xff08 overfitting xff09 人工智能中的模型 xff08 Artificial Intelligence Model xff09 指的是一些算法和数学模型
  • 中国移动提出的ABCDNETS和DSSN数联网技术介绍

    一 引言 在2023年4月14日 xff0c 中国移动召开 数据要素流通与治理产业高峰论坛上 xff0c 中国移动发布了 数联网 xff08 DSSN xff09 白皮书 xff0c 同时发布了全球首创的数联网 DSSN 服务平台等产品 x
  • Python循环语句(while循环、for循环)

    Python循环语句 一 while循环二 for语句三 range 函数四 break 和 continue 语句五 pass语句 Python循环语句主要有while循环和for循环 xff0c Python 循环语句的控制结构图如下所
  • 深度学习笔记一:深度学习环境的搭建

    首先需要下载anaconda xff08 官方网站下载 xff09 一路选择next即可 这里我没有选择添加环境变量 xff0c 如果有需要 xff0c 后期可以手动添加 xff0c 这里可以根据自己情况选择 安装完成后 xff0c 从wi
  • HAN论文模型代码复现与重构

    论文简介 本文主要介绍CMU在2016年发表在ACL的一篇论文 xff1a Hierarchical Attention Networks for Document Classification及其代码复现 该论文是用于文档级情感分类 xf
  • Http Digest认证协议

    http blog csdn net htjoy1202 article details 7067287 其认证的基本框架为挑战认证的结构 xff0c 如下图所示 xff1a xfeff xfeff 1 客户端希望取到服务器上的某个资源 x
  • 【系统分析师之路】嵌入式系统章节错题集锦

    系统分析师之路 嵌入式系统章节错题集锦 系分章节错题集第01题 xff1a 红色 01 雷达设计人员在设计数字信号处理单元时 xff0c 其处理器普遍采用DSP芯片 xff08 比如 xff1a TI公司的TMS320C63xx xff09
  • 【软工】程序编码

    目录 前言正文 程序设计语言 分类 选择原则 程序编码总原则 好程序的标准 结构化程序设计 主要内容 主要原则 程序设计风格 源程序文档化 数据说明 语句结构 输入输出方法 程序设计质量评价 正确性结构清晰性易修改性 易读性 简单性 程序复
  • TPM1.2到TPM 2.0的变化

    原文地址 xff1a http www vonwei com mod 61 pad amp act 61 view amp id 61 11 TPM 1 2规范主要面向PC平台 xff0c 其103版本在2009年被接受为ISO标准 xff
  • 关于Cmake与CmakeLists(一)--背景,须知,示例

    一 背景及须知 1 背景 xff1a VS2019与VS2010在编写程序时都是创建了一个工程 xff0c 然后直接打开 sln即可 但是vscode仅仅是一个编辑器 xff0c 打开之后只有 c或者 cpp文件 xff0c 故需要手动编译