团队项目·冰球模拟器——cmake 自动化构建系统的配置文件的编写
1 前言
考虑到命令行界面下编译程序并不如在 IDE 那么直观,再考虑到各位队友对 Linux 并不熟悉,如何大幅度地减轻整个项目的开发复杂度就是一个很重要的问题。
在 Linux 下有个很古老但很有用的自动化构建系统:make,它会读取当前目录下的Makefile(或其它名字)作为配置文件,并依照规则全自动完成相应的构建命令。但是有个坏处是:它相对来说比较难编写,不那么容易上手。因此又产生了大量的构建出Makefile的软件,如automake、premake、cmake等等。
本人在 Linux 下使用的 IDE 是 Clion,它是基于 cmake 来管理整个工程的。而使用 cmake 并不需要安装 Clion,对于其他人来说有很大的自由度。因此,本人将花时间编写各个CMakeLists.txt等配置文件,最终达到一个命令完成构建的效果。
2 需求分析
首先,根据本人对本项目的文件结构设计(见这篇博文),配置文件必须要能够让 cmake 生成各种模块以及可执行文件。
其次,为了减少重复编译,应当生成多个相对独立的库文件,然后在最后才链接成最终的可执行文件。
最后,由于有第三方库的存在,如 Xenomai 开发库、CppUnit 单元测试库等,且安装路径不一定是固定的,故需要 cmake 通过一定的规则确定库文件的具体位置,缩小 debug 过程中问题的查找范围。
3 CMakeLists.txt 文件编写
3.1 根目录的CMakeLists.txt
该文件(见源代码)主要用于设置输出文件位置、C++语言标准、预定义符号等全局性的设置。
在配置完相关内容后,使用 add_subdirectory(src) 进入到源代码目录进行编译。
3.2 src/CMakeLists.txt
该文件(见源代码)主要用于编译项目入口。流程如下:
- 首先使用
find_package()来寻找必须的第三方库的位置,如 Xenomai 开发库等。然后引入相应的引用路径和链接库路径。这一步需要编写相应的Findxxxx.cmake文件。 - 再进入
src/interpolation等子模块目录中进行模块的编译。 - 最后将相应的文件用
add_executable()命令生成主程序,并将子模块用target_link_libraries链接上去,完成编译。 - 再对单元测试进行相似的处理。
3.3 src/<子模块>/CMakeLists.txt
子模块中的编译要求较为简单,只需要目录下所有源代码文件使用 add_library() 命令编译成相应的静态链接库文件即可。
3.4 modules/Findxxxx.cmake
这是供 cmake 专用的文件,本身不直接用于构建。在本项目中位于根目录的 modules 文件夹下,详见Github 仓库。工作流程如下:
- 使用
find_path()命令确定模块里面某个特有的文件所在的路径,间接定位库所在的路径。需要提供可能出现的位置来辅助查找。 - 判断是否找到,若找到,定义相应的变量,如
xxxx_INCLUDE_DIRS、xxxx_LIBRARIES_DIRS等。
4 编译&运行
4.1 编译
由于配置文件已经做好了大部份工作,因此,我们只需要在项目的根目录(即有 README.md 的目录)下运行以下命令即可。
cmake . # 生成 Makefile 文件
make # 使用 make 进行构建
但是,cmake 本身会产生一些如 CMakeCache.txt 等临时文件,若不想污染整个目录,建议进行如下操作:
mkdir build # 创建 build 文件夹。build 目录已经被 git 忽略了,见 .gitignore
cd build # 进入工作文件夹
cmake .. # 注意,需要提供根目录的位置
make # 使用 make 进行构建
若无报错,则会在工作目录下的 ./build 文件夹中得到生成的二进制文件。文件结构示例如下:
build
| air_hockey # 主程序
| unit_test # 单元测试程序
| libinterpolation.a # 插值算法静态库
| libtasks.a # 任务实现静态库
...
4.2 运行
4.2.1 单元测试
单元测试程序运行如下
./build/unit_test <测试集名>
该程序有一可选参数<测试集名>,若不指定,则会运行未命名测试集(在本项目中则为所有测试);若指定,则只运行对应的测试集。
4.2.2 主项目
主项目运行如下
./build/air_hockey
在标准输入输出中可见日志信息。
团队项目·冰球模拟器——cmake 自动化构建系统的配置文件的编写的更多相关文章
- 开发效率优化之自动化构建系统Gradle(二)下篇
阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680本篇文章将继续从自定义 Gradle 插件开发来介绍自动化构建系统 ...
- 开发效率优化之自动化构建系统Gradle(二)上篇
阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680 本篇文章将以下两个内容来介绍自动化构建系统Gradle: gra ...
- Vue项目模板--和--webpack自动化构建工具的---项目打包压缩使用
[首先安装node.js]: 1. 从node.js官网下载并安装node,安装过程很简单. 2. npm 版本需要大于 3.0,如果低于此版本需要升级它: # 查看版本 npm -v2.3.0 #升 ...
- [Cake] 0.C# Make自动化构建-简介
0.Cake是什么? Cake是C# Make的缩写,是一个基于C# DSL的自动化构建系统.它可以用来编译代码,复制文件以及文件夹,运行单元测试,压缩文件以及构建Nuget包等等. 熟悉大名鼎鼎的M ...
- xmake v2.3.1 发布, 无缝对接其他构建系统
最近对xmake内部做了不少的重构来改进,并且新增了不少实用的新特性,欢迎来体验. 项目源码 官方文档 一些新特性: 一键编译其他构建系统维护的项目,实现无缝对接,并且支持交叉编译(比如autotoo ...
- 在Azure DevOps Server (TFS) 中修改团队项目名称
概述 [团队项目]: 在Azure DevOps Server (原名TFS)中,团队项目(Team Project)是一个最基本的数据组织容器,包含了一个团队或者信息系统中的所有信息,包括源代码.文 ...
- 201671010406-丁家辉-实验十四 团队项目评审&课程学习总结
实验十四 团队项目评审&课程学习总结 项目 内容 这个作业属于哪个课程 [教师博客主页链接] 这个作业的要求在哪里 [作业链接地址] 作业学习目标 (1)掌握软件项目评审会流程(2)反思总结课 ...
- 《hello--world团队》第六次作业:团队项目系统设计改进与详细设计
项目 内容 这个作业属于哪个课程 2016级计算机科学与工程学院软件工程(西北师范大学) 这个作业的要求在哪里 实验十 团队作业6:团队项目系统设计改进与详细设计 团队名称 <hello--wo ...
- 浅谈自动化构建之gulp
一.gulp的基本使用 gulp是目前最流行的前端自动化构建系统,核心特点高效易用.(这块不过多的废话了,直接上干货了,有兴趣的话,可以查下gulp简介) 步骤如下: yarn init -y yar ...
随机推荐
- zoj 3761
很简单但很虐心的一道题: 我感觉自己的算法没错,但是老是过不了:= = 但是还是把代码贴出来: 我的方法,用并查集的方式做一课树,然后对树进行遍历: 有多少棵树就有多少个点剩余: #include&l ...
- ZOJ 2750 Idiomatic Phrases Game(Dijkstra)
点我看题目 题意 : 给定一本字典,字典里有很多成语,要求从字典里的第一个成语开始,运用字典里的成语变到最后一个成语,变得过程就是成语接龙,后一个成语的第一个字必须有前一个成语的最后一个字相等,给定的 ...
- PYTHON的CGIServer的进化
按例程,一步一步理解如何从SOCKET,TCP,HTTP,CGIHTTP进化的. 最终,静态文件和脚本分享,且能处理FORM提交和展示. 下一步,到数据库??:) A,SOCKET #HTTPserv ...
- easyui源码翻译1.32--TreeGrid(树形表格)
前言 扩展自$.fn.datagrid.defaults.使用$.fn.treegrid.defaults重写默认值对象.下载该插件翻译源码 树形表格用于显示分层数据表格.它是基于数据表格.组合树控件 ...
- spring+mybatis 框架搭建
注意<!-- 中间的字要保持与左右留出一个空格,否则会报错说出现两杠线 --> 1.导入jar包 aopalliance-1.0.jarasm-3.3.1.jarcglib-2.2.2.j ...
- Spring事务传播特性的浅析——事务方法嵌套调用的迷茫
Spring事务传播机制回顾 Spring事务一个被讹传很广说法是:一个事务方法不应该调用另一个事务方法,否则将产生两个事务.结果造成开发人员在设计事务方法时束手束脚,生怕一不小心就踩到地雷. 其实这 ...
- leetcode面试准备:Reverse Words in a String
leetcode面试准备:Reverse Words in a String 1 题目 Given an input string, reverse the string word by word. ...
- hdu4649Professor Tian
http://acm.hdu.edu.cn/showproblem.php?pid=4649 枚举当前状态是0或者是1的概率 其实就枚举1的概率 最后概率乘这个数 位运算用得不熟 老出错 #incl ...
- 腾讯微博OAuth2.0认证介绍
腾讯微博开放平台,是基于腾讯微博系统,为广大开发者和用户提供的开放数据分享与传播平台. 广大开发者和用户登录平台后,就可以使用平台提供的开放API接口,创建应用从微博系统获取信息,或将新的信息传播到整 ...
- HDU-1036 Average is not Fast Enough!
Average is not Fast Enough! http://acm.hdu.edu.cn/showproblem.php?pid=1036 Problem Description A rel ...