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 @[email protected]
#define Tutorial_VERSION_MINOR @[email protected]

当CMake配置这个头文件时,@[email protected]与 @[email protected]的值将由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是否编译和使用。

时间: 2024-07-29 03:40:25

CMAKE 教程前两章节学习的相关文章

入职第三周——总结前两周学习内容

入职第二周,我系统性的学习了mui框架以及angularjs,并且自己简单的写了一个登录页面.在做这个登录界面的时候,我接触到了html5+,这是hbulider自己写的接口,针对android原生api,在用html5写的时候可以调用html5+的接口,这样就可以使用android原生api,比如相机.录音或者通讯录等等. 入职第三周,我想通过项目来完善自己的技术,因为只是看看文档太无聊了,要真正动手做在实践中学习和成长才是正确的编程方式.所以我打算开发一个app,经过指导老师的建议,我准备开

混血妆容教程 妆前两步排水肿不脱妆

混血妆容教程 妆前两步排水肿不脱 http://baozoumanhua.com/users/13998545/forum_articleshttp://baozoumanhua.com/users/13998544/forum_articleshttp://baozoumanhua.com/users/13998551/forum_articleshttp://baozoumanhua.com/users/13998554/forum_articleshttp://baozoumanhua.c

最近找到了一个免费的python教程,两周学会了python开发【内附学习视频】

原文链接:https://blog.csdn.net/weixin_41052734/article/details/86528541 最近找到了一个免费的python教程,两周学会了python开发.推荐给大家,希望召集更多的朋友一起学习python. 最近开始整理python的资料,博主建立了一个qq群,希望给大家提供一个交流的同平台: 78486745 ,欢迎大家加入共同交流学习. 本套教程学习时间15天 第一阶段(1-8天) 该阶段我们正式进入Python这门语言的学习,首先通过了解Py

阅读《大型网站技术架构》前两章心得体会及总结

最近阅读了<大型网站技术架构>这一本书,对于这一行业刚入门的菜鸟来说,虽然只读了前两章,却让我感受颇深,同时也学习和见识到了很多之前不了解.不明白的东西. 通过阅读前两章,我才真正的初步明白了一个刚刚成型的小型网站是如何一步一步的成长为一个大型网站.从网站的最开始的基础架构,到一步步实现网站的性能提升,到如何处理网站的高并发数据,到使用反响代理和CDN加速网站响应,让我一步一步的真正的认识到了架构的重要性,也让我这个菜鸟学习到了很多之前不懂的知识. 第一章主要讲授了大型网站架构演化的发展历程,

张量漫谈(前两篇)

文档下载: 张量漫谈_第一篇 张量漫谈_第二篇 最初的目的是为了供大一高等代数复习之用,他们学习这部分使用的教材是<高等线性代数学>,关于张量的这部分书本上的错误和不自然的地方很多,由于缺乏资料,索性自己写一份讲义.预计三篇,这是前两篇,最后一篇预计讨论一般模的张量,同样,最后一篇短期内也不会更新. 附原文摘要:张量为什么要如此定义? 这或许是一个让人头疼的问题. 因为其复杂的而多样定义让人感到困惑. 简单的定义无法抓到本质, 复杂的定义缺乏解释. 更为关键的是, 似乎在目力所及的范围内也很难

php如何获取到前两个页面的url

自己在学习过程中也遇到了类似的问题: 比如,后台是想做成这样子的: 但是实际则是这样的: 解决方法: 通过表单隐藏控件 <input type="hidden" name="prevurl" value="<?php echo $_SERVER['HTTP_REFERER']?>"> 这样$_SERVER['HTTP_REFERER']的值就暂时存到了$_POST[prevurl]里. 暂时没想到更好的方法. php如何获

BestCoder Round #4 前两题 hdu 4931 4932

第一题太水了.. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 int a[6]; 7 int main(){ 8 int cas; 9 scanf( "%d", &cas ); 10 while( cas-- ){ 11 for( int i = 0; i <

前两天有人问怎么取得一个目录下的文件,下面就是例子

<%@ Language=VBScript %> <% '================================================================ '函数名称:FileList '函数功能:列出目录下所有文件 '主要参数说明: '1--FolderUrl 虚拟路径 不可为空 '2----FileExName 文件扩展名 '函数返回值:收文记录 '====================================================

WORD中如何让前两页不显示页码

WORD中如何让前两页不显示页码   上稿人:ojn 点击率: 15191   我们有时在用word编辑文档时,会遇上第一.二页无需显示页码,第三页才是正文的第一页时,该如何正确插入页码呢? 以word 2010为例,方法如下: 假如第1-2页无页码,第3页开始插入页码,起始页为1. 1.将光标定位在第2页末尾处,点击“页面布局——(页面设置)分隔符——(分节符)下一页” 2.双击第3页的页脚处,进入页眉和页脚的编辑状态,点击工具栏中的“链接到前一条页眉”按钮,使其使其退出高亮状态. 3.点击“