最基础的同级文件操作

首先,创建CMakeLists.txt,这是CMake处理的基本文件。首先给出只有一个文件的最简单的情况:

PROJECT (HELLO)
SET(SRC_LIST main.cc)
MESSAGE(STATUS "This is BINARY dir " ${HELLO_BINARY_DIR})
MESSAGE(STATUS "This is SOURCE dir " ${HELLO_SOURCE_DIR})
ADD_EXECUTABLE(hello ${SRC_LIST})

几个说明:

  • PROJECT:这是项目名称说明,直接添加项目名称即可。
  • SET:变量说明,用于显示的变量定义,有多个源文件,可以设置为 SET(SRC_LIST main.cc t1.cc t2.cc)
  • MESSAGE:向终端输出用户定义的信息,三种类型:
    • SEND_ERROR:产生错误,生成过程被跳过
    • STATUS:输出前缀为-的信息
    • FATAL_ERROR:立即终止所有的cmake过程
  • ADD_EXECUABLE:添加源文件操作,${}是获取变量的操作,这与shell语法一致。hello是可执行文件的名称,可执行文件名称和工程名称没有任何关系。
  • <projectname>_BINARY_DIR或者PROJECT_BINARY_DIR是指编译发生的当前目录;本例子中说的是build目录

之后,在CMakeLists.txt同级文件夹中,创建一个build文件夹,之后cd build,执行以下两个命令:

  • cmake ..:CMake构建有关的MakeFile等
  • make:执行make编译操作,生成可执行文件

复杂多级目录操作

这里的文件设计到多个目录,同时我们还有帮助文档等。在编译完成后,我们希望把可执行文件加入到指定的bin目录中,最后还要把程序安装在操作系统的/usr/bin目录中。

首先创建目录结构:

.
├── build
├── CMakeLists.txt
└── src├── CMakeLists.txt└── main.cpp

其中,main.cpp与上一节的一致,build文件夹同级的CMakeLists.txt的内容如下:

CMAKE_MINIMUM_REQUIRED(VERSION 3.14)
PROJECT(HELLO)
ADD_SUBDIRECTORY(src bin)

main.cpp同级的目录内容如下:

ADD_EXECUTABLE(hello main.cpp)

说明ADD_SUBDIRECTORY的意义:ADD_SUBDIRECTORY(source_dir [binary_dir] [EXCLUDE_FROM_ALL])。该指令用于向当前工程添加存放源文件的子目录,并指定中间二进制和目标二进制存放的位置。EXCLUDE_FROM_ALL的含义是把这个目录从编译过程中排除。

注意上述完成编译后,我们在build目录下发现了一个bin目录,这个目录内部有一个hello可执行文件。如果我们想把可执行文件放到其他地方,或者把动态链接库或者静态链接库放到其他地方,需要分别执行以下两个命令:

  • SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
  • SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
    因为我们有两个CMakeLists.txt,添加语句的原则是:在哪里使用 ADD_EXECUTABLE或者ADD_LIBRARY,如果需要改变目标存放路径,就在需要改变的地方加入相关语句。本例子中,肯定实在src的CMakeLists.txt文件中添加了。

CMake定义安装目录

一般来说,makefile执行make过后,可以使用make install进行安装。在CMake中,我们可以自定义安装目录,实现可执行文件或者程序库的安装操作,这里涉及到一个核心变量CMAKE_INSTALL_PREFIX和一个核心指令INSTALL

使用SET命令可以显示指定第一个变量的具体值,之后可以进行INSTALL命令的配置,基本的配置方式如图:

给出一个简单的例子:

myrun可执行二进制文件安装到了${CMAKE_INSTALL_PREFIX}/bin目录中,mylib动态链接库和mystaticlib分别安装到对应的目录中。我们不需要关系TARGETS具体生成的路径,只需要添加上TARGETS名称即可。

举个实战例子,首先在桌面创建foo文件夹,之后在上一节的最外层的CMakeLists.txt文件的最后,追加如下命令:

SET(CMAKE_INSTALL_PREFIX /home/erick/Desktop/foo)
INSTALL(TARGETS helloRUNTIME DESTINATION bin
)

之后进入工程的build目录,依次执行:cmake ..makemake install。最后会发现桌面的foo目录下多了一个bin文件夹,里面是hello可执行文件。

有些时候,我们也需要安装文档到合适的位置,这个指令也包含在INSTALL中,举个例子:

INSTALL(DIRECTORY doc/ DESTINATION /share/dock/cmake/pro)

如果不指定特殊的路径,CMAKE_INSTALL_PREFIX默认是/usr/local

CMake笔记1 构建基本的项目相关推荐

  1. CMake笔记3构建复杂项目

    直接参考:https://blog.csdn.net/ktigerhero3/article/details/70313350

  2. CMake笔记2 构建动态链接库

    新建一个文件夹,然后创建如下的目录: . ├── build ├── CMakeLists.txt └── lib├── CMakeLists.txt├── hello.cpp└── hello.h ...

  3. CMake 学习笔记 02 - 更复杂的项目

    CMake 学习笔记 02 - 更复杂的项目 源代码见 https://github.com/fengyc/cmake-tutorial 源代码目录组织 一般的项目,会划分为多个子目录,每个子目录中包 ...

  4. 学习C++:C++进阶(三)CMake基础篇---用一个小型项目了解CMake及环境构建

    V1.1 于2022年7月15日第二次修改:添加了比较多的解释图,解读了各类库的CMakelist.txt文件 目录 第一部分 基础篇(Basics) 1.0 本部分主要学什么(Intro) 1.1 ...

  5. 第四周读书笔记《构建之法》

    第四周读书笔记<构建之法> 第四周读书笔记<构建之法> 沈三景 PB15061249 软件工程 读书笔记 前言 本周接着读了构建之法(上周读了<程序员的修炼之道>) ...

  6. Git笔记(24) 维护项目

    Git笔记(24) 维护项目 1. 在特性分支中工作 2. 应用来自邮件的补丁 2.1. 使用 apply 命令应用补丁 2.2. 使用 am 命令应用补丁 3. 检出远程分支 4. 确定引入了哪些东 ...

  7. 电商数仓描述_笔记-尚硅谷大数据项目数据仓库-电商数仓V1.2新版

    架构 项目框架 数仓架构 存储压缩 Snappy与LZO LZO安装: 读取LZO文件时,需要先创建索引,才可以进行切片. 框架版本选型Apache:运维麻烦,需要自己调研兼容性. CDH:国内使用最 ...

  8. 在k8s中使用gradle构建java web项目镜像Dockerfile

    在k8s中使用gradle构建java web项目镜像Dockerfile FROM gradle:6-jdk8 AS build COPY --chown=gradle:gradle . /home ...

  9. Maven学习总结(八)——使用Maven构建多模块项目

    2019独角兽企业重金招聘Python工程师标准>>> Maven学习总结(八)--使用Maven构建多模块项目 在平时的Javaweb项目开发中为了便于后期的维护,我们一般会进行分 ...

最新文章

  1. 树状数组的理解(前缀和 and 差分)
  2. 教你用深度学习LSTM网络预测流行音乐趋势(附代码)
  3. sj 网页前端与后台数据交互的3种方式
  4. Oracle创建用户、表空间、导入导出、...命令
  5. go语言的main函数
  6. html游戏源妈简单,最简单的HTML5游戏——贪吃蛇
  7. 七年前将UC卖给马云,套现300亿的何小鹏,现今再创新奇迹?播报文章
  8. 表格长度_知道你的成绩单是怎么打印的吗?超长Excel表格1页打印,拯救A4纸
  9. CVPR2022 Oral | CosFace、ArcFace的大统一升级,AdaFace解决低质量图像人脸识
  10. 网络不稳定的原因_原来网络不稳定,也有可能是这个原因造成的!
  11. c++ 将变量有序保存在txt文件中_python读写文件(四)
  12. python惰性_如何创建惰性属性以提高Python的性能
  13. Alex 的 Hadoop 菜鸟教程: 第21课 不只是在HBase中用SQL:Phoenix
  14. 分兵策略应对高速发展
  15. ccy测试dlx 模块化与全局变量
  16. 查看DBUS接口的工具: D-Feet
  17. STM32F407的时钟
  18. 低功耗4g无线视频服务器,低功耗4G+AI+IOT视频安防行业的首选
  19. 地铁大数据挖掘之数据预处理——从原始一卡通数据提取城市地铁客流(二)
  20. 【原创】Javaweb篮球俱乐部网站(Web网站毕业设计)

热门文章

  1. python文件输入符_python基础入门详解(文件输入/输出 内建类型 字典操作使用方法)...
  2. GhostNet 解读及代码实验(附代码、超参、日志和预训练模型)
  3. pytorch学习笔记(十三):Dropout
  4. 目标检测——使用loss发现噪声数据
  5. 使用远程服务器Spyder
  6. R every day !
  7. leetcode770. Basic Calculator IV
  8. 【Linux】Linux进阶指令
  9. Java:反射和注解从入门到放弃
  10. 敏捷开发中asp.net MVC的开发次序感受(先开发View?先开发Model?先开发Controller!)...