CMake笔记1 构建基本的项目
最基础的同级文件操作
首先,创建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 ..
、make
、make install
。最后会发现桌面的foo目录下多了一个bin文件夹,里面是hello
可执行文件。
有些时候,我们也需要安装文档到合适的位置,这个指令也包含在INSTALL
中,举个例子:
INSTALL(DIRECTORY doc/ DESTINATION /share/dock/cmake/pro)
如果不指定特殊的路径,CMAKE_INSTALL_PREFIX
默认是/usr/local
CMake笔记1 构建基本的项目相关推荐
- CMake笔记3构建复杂项目
直接参考:https://blog.csdn.net/ktigerhero3/article/details/70313350
- CMake笔记2 构建动态链接库
新建一个文件夹,然后创建如下的目录: . ├── build ├── CMakeLists.txt └── lib├── CMakeLists.txt├── hello.cpp└── hello.h ...
- CMake 学习笔记 02 - 更复杂的项目
CMake 学习笔记 02 - 更复杂的项目 源代码见 https://github.com/fengyc/cmake-tutorial 源代码目录组织 一般的项目,会划分为多个子目录,每个子目录中包 ...
- 学习C++:C++进阶(三)CMake基础篇---用一个小型项目了解CMake及环境构建
V1.1 于2022年7月15日第二次修改:添加了比较多的解释图,解读了各类库的CMakelist.txt文件 目录 第一部分 基础篇(Basics) 1.0 本部分主要学什么(Intro) 1.1 ...
- 第四周读书笔记《构建之法》
第四周读书笔记<构建之法> 第四周读书笔记<构建之法> 沈三景 PB15061249 软件工程 读书笔记 前言 本周接着读了构建之法(上周读了<程序员的修炼之道>) ...
- Git笔记(24) 维护项目
Git笔记(24) 维护项目 1. 在特性分支中工作 2. 应用来自邮件的补丁 2.1. 使用 apply 命令应用补丁 2.2. 使用 am 命令应用补丁 3. 检出远程分支 4. 确定引入了哪些东 ...
- 电商数仓描述_笔记-尚硅谷大数据项目数据仓库-电商数仓V1.2新版
架构 项目框架 数仓架构 存储压缩 Snappy与LZO LZO安装: 读取LZO文件时,需要先创建索引,才可以进行切片. 框架版本选型Apache:运维麻烦,需要自己调研兼容性. CDH:国内使用最 ...
- 在k8s中使用gradle构建java web项目镜像Dockerfile
在k8s中使用gradle构建java web项目镜像Dockerfile FROM gradle:6-jdk8 AS build COPY --chown=gradle:gradle . /home ...
- Maven学习总结(八)——使用Maven构建多模块项目
2019独角兽企业重金招聘Python工程师标准>>> Maven学习总结(八)--使用Maven构建多模块项目 在平时的Javaweb项目开发中为了便于后期的维护,我们一般会进行分 ...
最新文章
- 树状数组的理解(前缀和 and 差分)
- 教你用深度学习LSTM网络预测流行音乐趋势(附代码)
- sj 网页前端与后台数据交互的3种方式
- Oracle创建用户、表空间、导入导出、...命令
- go语言的main函数
- html游戏源妈简单,最简单的HTML5游戏——贪吃蛇
- 七年前将UC卖给马云,套现300亿的何小鹏,现今再创新奇迹?播报文章
- 表格长度_知道你的成绩单是怎么打印的吗?超长Excel表格1页打印,拯救A4纸
- CVPR2022 Oral | CosFace、ArcFace的大统一升级,AdaFace解决低质量图像人脸识
- 网络不稳定的原因_原来网络不稳定,也有可能是这个原因造成的!
- c++ 将变量有序保存在txt文件中_python读写文件(四)
- python惰性_如何创建惰性属性以提高Python的性能
- Alex 的 Hadoop 菜鸟教程: 第21课 不只是在HBase中用SQL:Phoenix
- 分兵策略应对高速发展
- ccy测试dlx 模块化与全局变量
- 查看DBUS接口的工具: D-Feet
- STM32F407的时钟
- 低功耗4g无线视频服务器,低功耗4G+AI+IOT视频安防行业的首选
- 地铁大数据挖掘之数据预处理——从原始一卡通数据提取城市地铁客流(二)
- 【原创】Javaweb篮球俱乐部网站(Web网站毕业设计)
热门文章
- python文件输入符_python基础入门详解(文件输入/输出 内建类型 字典操作使用方法)...
- GhostNet 解读及代码实验(附代码、超参、日志和预训练模型)
- pytorch学习笔记(十三):Dropout
- 目标检测——使用loss发现噪声数据
- 使用远程服务器Spyder
- R every day !
- leetcode770. Basic Calculator IV
- 【Linux】Linux进阶指令
- Java:反射和注解从入门到放弃
- 敏捷开发中asp.net MVC的开发次序感受(先开发View?先开发Model?先开发Controller!)...