CMAKE 教程前两章节学习
原文 https://cmake.org/cmake-tutorial/
以下是一个循序渐进的教程,它覆盖了CMAKE帮助改进的通常的构建系统的话题。许多话题在《掌握CMAKE》(《Mastering CMake》)已经作为单独话题介绍,但是在一个示例工程中运用它们会更有帮助于学习。教程可以再本项目开源代码Tests/Tutorial 目录下找到代码树。每一步操作都有包含完整代码的子目录。
第一步 基础起点
最基础的工程就是从代码中构建一个执行文件。对于简单工程来说,仅仅需要两行CMAKELISTS文件内容。 CMakeLists.txt内容看起来是这样:
cmake_minimum_required (VERSION 2.6)
project (Tutorial)
add_executable(Tutorial tutorial.cxx)
注意CMakeLists.txt文件中的例子使用的是小写命令。CMake支持大写、小写、混合大小写命令。tutorial.cxx 将计算一个数字的平方根。第一个版本的例子十分简单,如下:
// A simple program that computes the square root of a number
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main (int argc, char *argv[])
{
if (argc < 2)
{
fprintf(stdout,"Usage: %s number\n",argv[0]);
return 1;
}
double inputValue = atof(argv[1]);
double outputValue = sqrt(inputValue);
fprintf(stdout,"The square root of %g is %g\n",
inputValue, outputValue);
return 0;
}
添加版本号和配置头文件
我们添加的第一个功能就是添加版本号。相比在代码中写入版本号,在CMakeLists.txt中提供此功能会更具有灵活性。 CMakeLists.txt文件中添加版本号修改如下:
cmake_minimum_required (VERSION 2.6)
project (Tutorial)
# The version number.
set (Tutorial_VERSION_MAJOR 1)
set (Tutorial_VERSION_MINOR 0)
# configure a header file to pass some of the CMake settings
# to the source code
configure_file (
"${PROJECT_SOURCE_DIR}/TutorialConfig.h.in"
"${PROJECT_BINARY_DIR}/TutorialConfig.h"
)
# add the binary tree to the search path for include files
# so that we will find TutorialConfig.h
include_directories("${PROJECT_BINARY_DIR}")
# add the executable
add_executable(Tutorial tutorial.cxx)
因为配置文件被写入到二进制文件树中我们必须将它加入到包含文件搜索路径中。我们创建一个TutorialConfig.h.in文件,它包含以下内容:
// the configured options and settings for Tutorial
#define Tutorial_VERSION_MAJOR @Tutorial_VERSION_MAJOR@
#define Tutorial_VERSION_MINOR @Tutorial_VERSION_MINOR@
当CMake配置这个头文件时,@Tutorial_VERSION_MAJOR@与 @Tutorial_VERSION_MINOR@的值将由CMakeLists.txt文件中的值来替代.当我们修改tutorial.cxx包含配置头文件并且版本号时候。代码如下:
// A simple program that computes the square root of a number
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "TutorialConfig.h"
int main (int argc, char *argv[])
{
if (argc < 2)
{
fprintf(stdout,"%s Version %d.%d\n",
argv[0],
Tutorial_VERSION_MAJOR,
Tutorial_VERSION_MINOR);
fprintf(stdout,"Usage: %s number\n",argv[0]);
return 1;
}
double inputValue = atof(argv[1]);
double outputValue = sqrt(inputValue);
fprintf(stdout,"The square root of %g is %g\n",
inputValue, outputValue);
return 0;
}
主要的改变在于添加了TutorialConfig.h头文件和将版本信息作为用户信息的一部分打印出来
//=========================================================
第二步 添加库
我们将添加一个库到我们的工程中。这个库包含我们自己实现的计算数字平方根的实现.执行文件能使用这个库来替代编译器提供的标准平方根函数。本教程中,我们将这个库放进一个子目录MathFunctions中。该目录包含一行内容的CMakeLists.txt 文件:
add_library(MathFunctions mysqrt.cxx)
源码文件mysqrt.cxx 有一个叫做mysqrt的函数,这个函数提供类型编译器的sqrt函数的功能。在顶层CMakeFiles.txt文件中调用我们加进子目录的库,以便于该库得到构造。我们同样使用另一个包含目录以便于MathFunctions/mysqrt.h 头文件能够找到函数原型。最后改变是添加这个新库到执行文件。顶层CMakeLists.txt文件最后几行看起来如下:
include_directories ("${PROJECT_SOURCE_DIR}/MathFunctions")
add_subdirectory (MathFunctions)
# add the executable
add_executable (Tutorial tutorial.cxx)
target_link_libraries (Tutorial MathFunctions)
现在我们来考虑如何使得这个库能够变得可选。本教程中,没有任何理由需要如此,但是在第三方提供的较大型的库中,你可能需要如此。第一步是在CMakeLists.txt文件中添加一个选项
# should we use our own math functions?
option (USE_MYMATH
"Use tutorial provided math implementation" ON)
This will show up in the CMake GUI with a default value of ON that the user can change as desired. This setting will be stored in the cache so that the user does not need to keep setting it each time they run CMake on this project. The next change is to make the build and linking of the MathFunctions library conditional. To do this we change the end of the top level CMakeLists.txt file to look like the following:
一下显示了CMake如何在默认值工作,该值用户可以改变。这个设置将存储在缓存中以便用户不需要每次运行CMake都保持该设置。下一步是是的构建和连接该库可根据条件构建。顶层CMakeLists.txt文件中我们添加如下:
# add the MathFunctions library?
#
if (USE_MYMATH)
include_directories ("${PROJECT_SOURCE_DIR}/MathFunctions")
add_subdirectory (MathFunctions)
set (EXTRA_LIBS ${EXTRA_LIBS} MathFunctions)
endif (USE_MYMATH)
# add the executable
add_executable (Tutorial tutorial.cxx)
target_link_libraries (Tutorial ${EXTRA_LIBS})
USE_MYMATH的设定的使用决定MathFunctions是否编译和使用。
CMAKE 教程前两章节学习的更多相关文章
- sqlserver -- 学习笔记(七)获取同组数据的前两条记录
不啰嗦,直接上图,大概实现效果如下: 有上面这样一份数据,将他们按照userAccount和submitTime进行分组,然后提前每组数据的前两条记录 提取后数据如下: 实现的SQL如下: selec ...
- 深度学习与CV教程(8) | 常见深度学习框架介绍
作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/37 本文地址:http://www.showmeai.tech/article-det ...
- 《Writing Idiomatic Python》前两部分的中文翻译
汇总了一下这本小书前两部分的内容: 翻译<Writing Idiomatic Python>(一):if语句.for循环 翻译<Writing Idiomatic Python> ...
- 学习javascript,您将发现以下两个学习指南
学习javascript,您将发现以下两个学习指南,一个是初学者的,另一个是茄子一号经验丰富的程序员和Web开发人员的.你想学习javascript并对它有兴趣.我想这就是你来这里的原因,你做了一个明 ...
- WORD中如何让前两页不显示页码
WORD中如何让前两页不显示页码 上稿人:ojn 点击率: 15191 我们有时在用word编辑文档时,会遇上第一.二页无需显示页码,第三页才是正文的第一页时,该如何正确插入页码呢? 以wor ...
- jsoi2014前两轮回眸
今天从常州回来了,第二轮考得惨不忍睹 大概来总结一下前两轮: 第一轮是4个小时,3道题,一道网络流,一道环形DP,一道线段树 最后一道题ahoi的原题(传送bzoj1798),非常水的线段树,是个很好 ...
- Js 正则表达式 写了一个正整数或小数点或分数前两个正则表达式
写了一个正整数或小数点或分数前两个正则表达式 /^[0-9]+([.]{1}[0-9]{1,2})? $/ 版权声明:本文博客原创文章.博客,未经同意,不得转载.
- 前两篇转载别人的精彩文章,自己也总结一下python split的用法吧!
前言:前两篇转载别人的精彩文章,自己也总结一下吧! 最近又开始用起py,是为什么呢? 自己要做一个文本相似度匹配程序,大致思路就是两个文档,一个是试题,一个是材料,我将试题按每题分割出来,再将每题的内 ...
- JavaBean的属性变量名前两个字母大小写问题
Java属性命名规范! 一般情况下.Java的属性变量名都已小写字母开头,如:userName,showMessage等,但也存在着特殊情况,考虑到一些特定的有意思的英文缩略词如(USA,XML等), ...
随机推荐
- cocos2dx 分辨率适配问题
分辨率适配问题好文章: http://www.cocoachina.com/bbs/read.php?tid=201987&page=1&toread=1#tpc http://www ...
- 【转】提高你开发效率的十五个Visual Studio 2010使用技巧
原文网址:http://developer.51cto.com/art/201203/321942.htm 2012-03-06 14:38 Ron Ngai Ron Ngai的博客 字号:T | T ...
- 由spring的工厂构造bean想到的
被Spring管理的bean可以是直接创建实例,还可以通过工厂模式来进行创建.例如brave的tracing bean定义: <bean id="tracing" class ...
- 转-oracle中比较两表表结构差异和数据差异的方法
oracle中比较两表表结构差异和数据差异的方法 原作者:li2008xue2008ling 出处:http://blog.csdn.net 在工作中需要完成这么一个需求:比较两个表的表 ...
- Unicode化
为了程序编写方便,根除乱码问题等等需求,很多新项目都采用了Unicode编码.同时,不少使用MBCS多字节编码的旧项目为了升级,也有了转向Unicode编码的意向.不过,从MBCS升级到Unicode ...
- bzoj 3119: Book
Description Wayne喜欢看书,更喜欢买书.某天Wayne在当当网上买书,买了很多很多书.Wayne有一个奇怪的癖好,就是第一本书的价格必须恰为X,而之后买的每一本书,若是比上一本更昂贵, ...
- Fiddler 抓包工具总结-bpafter
转摘https://www.cnblogs.com/shy1766IT/p/5199334.html Fiddler 抓包工具总结 名称 含义 # 抓取HTTP Request的顺序,从1开始,以 ...
- C++ sort使用自定义函数的一些坑
先看代码: 解释:使用自定义比较函数时,如果用了返回值恒为$true$或者恒为$false$的比较函数,就会这样子. 原因: https://stackoverflow.com/questions/4 ...
- Android 多线程注意事项
参考:http://blog.csdn.net/x86android/article/details/14161981 http://geeksun.iteye.com/blog/1447708 An ...
- 《OpenCL异构并行编程实战》补充笔记散点,第五至十二章
▶ 第五章,OpenCL 的并发与执行模型 ● 内存对象与上下文相关而不是与设备相关.设备在不同设备之间的移动如下,如果 kernel 在第二个设备上运行,那么在第一个设备上产生的任何数据结果在第二个 ...