CMake 简明教程(2)---编译库文件_cmake编译库文件-程序员宅基地

技术标签: cmake  教程  

这一次,我们会给我们的工程添加一个库。这个库包含我们自定义的计算实数平方根的函数。之后工程编译出的可执行文件会使用这个库的平方根计算函数,而不是在Toturial.cxx文件中include一个函数。这次我们将生成这个库的代码放到一个叫MathFunctions的子目录。CMakeLists.txt需要包含如下行:

add_library(MathFunctions mysqrt.cxx)

名为“sqrt.cxx”的文件包含一个叫做mysqrt的函数,这个函数提供与默认sqrt函数相似的功能。为了使用新编译出的库,我们需要在CMakeLists.txt文件靠前的位置使用add_subdirectory函数告诉cmake 在使用这个库之前编译这个库。同时,我们也要使用include_directories来告诉cmake 在哪里

找MathFunctions/mysqrt.h。添加库的代码大致如下:

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) 

这些代码会cmake gui界面中显示一个默认为ON的选项,用户可以根据需要选择是否启用它。这一选项会被保存在缓存文件中,这样用户就不必须在每次启动这个cmake项目时都重新设置。接下来要做的就是根据选项决定是否编译和链接MathFunctions库,体现在代码上就是在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库。需要注意通常会有一个变量(这个例子中是EXTRA_LIBS)收集可选的之后要被编译到可执行文件的库。这是一个常用来保持较大且有很多可选库的项目清洁的方法。对应新的选项,代码也会有相应的变化:

// A simple program that computes the square root of a number
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "TutorialConfig.h"
#ifdef USE_MYMATH   // 这一宏的使用还要和cmake文件配合详见后文
#include "MathFunctions.h"
#endif
 
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]);
 
#ifdef USE_MYMATH   // 使用定义的宏
  double outputValue = mysqrt(inputValue);
#else
  double outputValue = sqrt(inputValue);
#endif
 
  fprintf(stdout,"The square root of %g is %g\n",
          inputValue, outputValue);
  return 0;
}

在代码中,我们使用了宏USE_MYMATH。这一宏是由CMake通过TutorialConfig.h.in配置文件提供给代码文件的,要实现它需要在TutorialConfig.h.in添加如下代码:

#cmakedefine USE_MYMATH






版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/LaineGates/article/details/31763787

智能推荐

bitcoin and cryptocurrency technologies-引言_bitcoin and cryptocurrrency techonlogies-程序员宅基地

文章浏览阅读580次。分歧乐观派:区块链将会颠覆全球的支付,经济,乃至政治格局。悲观派:比特币存在内部缺陷,只不过是昙花一现,必将走向衰落。本书讲的什么让你从技术层面理解数字货币运行机制。本书将让你能够回答以下问题:比特币是如何运行的?比特币如此特殊的原因的什么?比特币是如何加密的?比特币是怎么做到匿名的?比特币平台的上,如何搭建应用。创造一个新的加密货币,能让世界发生怎么的变化?合适人群..._bitcoin and cryptocurrrency techonlogies

Python 函数定义及调用(1)_python中函数返回一个可能不存在的变量该怎么写-程序员宅基地

文章浏览阅读875次,点赞10次,收藏2次。1、函数的功能:(1)代码的一种组织形式;(2)一个函数一般完成一项特定的功能。2、函数使用(1)函数需要先定义(2)使用函数,俗称调用3、函数定义的一般规则(1)def 关键字,后跟一个空格;(2)函数名,自己定义,起名需要遵循便令命名规则,约定俗成,大驼峰命名方法;(3)后面括号和冒号不能省,括号内可以由参数;(4)函数内所有代码缩进。..._python中函数返回一个可能不存在的变量该怎么写

探索高效数据结构与算法:elarity/data-structure-php-clanguage-程序员宅基地

文章浏览阅读323次,点赞5次,收藏8次。探索高效数据结构与算法:elarity/data-structure-php-clanguage项目地址:https://gitcode.com/elarity/data-structure-php-clanguage在这个数字化的时代,对数据结构和算法的理解是每个开发者不可或缺的技能。今天我们要推荐的是一个开源项目——elarity/data-structure-php-clanguage,...

2008最新全套计算机毕业设计_计算机毕业设计下载-程序员宅基地

文章浏览阅读3k次,点赞3次,收藏6次。计算机应用,计算机信息管理, 计算机网络, 计算机软件, 计算机科学与技术毕业设计网主要向广大计算机专业的各类本、专科毕业生(包括全日制正规高校、自考、各级电大、夜大、函授、成人教育等类型的计算机应用,计算机信息管理, 计算机网络, 计算机软件, 计算机科学与技术,电子商务等方向),提供计算机毕业设计论文参考资料(包括计算机论文、计算机毕业论文、计算机毕业设计)、免费的计算_计算机毕业设计下载

计算机网络---考前最后一背_幕布 计算机网络-程序员宅基地

文章浏览阅读4.6k次,点赞8次,收藏66次。1. 计算机网络向用户提供的最重要的两大功能:连通和共享。2. 计算机网络就是为数据交换提供服务的,是作为提供数据发送、传输、接收服务的基础设施。3. 定义了通信实体之间交换的报文的格式和传输顺序,以及在报文发送和/或接收或者其他事件方面所采取的行动(响应)。协议的基本要素:语法、语义和同步4. 网络按照其位置和提供的功能,可以划分为两个大的部分:位于网路边缘的资源子网,和网络核心通信子网。5. ETF 组织发布网络标准化文档的形式是 RFC 文档。6. 端到_幕布 计算机网络

【ElasticSearch系列-08】ElasticSearch处理对象间的关联关系_xcontentfactory.jsonbuilder().startobject() .start-程序员宅基地

文章浏览阅读973次,点赞27次,收藏29次。深入理解es对象间的关联关系_xcontentfactory.jsonbuilder().startobject() .startobject 对象类型

随便推点

J2ME开发入门-程序员宅基地

文章浏览阅读55次。原文发布时间为:2008-07-31 —— 来源于本人的百度文章 [由搬家工具导入]J2ME开发入门J2ME方面开发的资料,确实是少之又少,一般给新手推荐的都是王森先生的《PDA与手机开发入门》一书,然而该书其实并不适合新人阅读,该书的前几章花了很大篇幅来讲解命令行调试J2ME程序的方法和很多要点,其实这些东西,作为一个初级的J2ME开发者来说,完全没有必要学习和掌握,反而只会给自己平添很多负担。...

【Python Practice】汇总-程序员宅基地

文章浏览阅读420次。所有练习题,来自这个仓库:https://github.com/darkprinx/100-plus-Python-programming-exercises-extended习题汇总 Day 1- Question 1-3 Day 2- Question 4-9 Day 3- Question 10-13 Day 4- Question 14-15 Day 5- Question 16-17 Day 6- Question 18-19 Day 7- Que._python practice

各种递归算法-程序员宅基地

文章浏览阅读90次。斐波那契数列定义:斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368........,这个数列从第3项开始,每一项都等于前两项之和。斐波那契数列又称黄金分割数列、因数学家列昂纳多·斐波那契(Le..._适用于递归实现的算法有

python高斯噪声怎么去除_用Python识别验证码-程序员宅基地

文章浏览阅读300次。很多网站登录都需要输入验证码,如果要实现自动登录就不可避免的要识别验证码。最近学习了一下图像处理相关的知识,并用Python实现了基于KNN的验证码识别。准备工作这里我们使用opencv做图像处理,所以需要安装下面两个库pip3 install opencv-pythonpip3 install numpy识别原理我们采取一种有监督式学习的方法来识别验证码,包含以下几个步骤图片处理 - 对图片进..._python 高斯噪音识别

2017级算法模拟上机准备篇(序列DP 进阶_1)-程序员宅基地

文章浏览阅读92次。进阶版的序列DP 从一道题的优化开始ModricWang的序列问题题目描述:给定一个序列,求出这个序列中的最长上升子序列的长度。这道题的本质还是求解一个最长上升子序列的问题相对与之前提到过的O(n^2)的算法 我们可以重新整理思路用O(nlogn)的思路来写,用贪心和二分优化之前的算法我们设置新的DP数组//dp[i]代表的是当前长度为i的上升子序列的末尾元素的大...

XSS攻击基础防御_xxs全防1.0免费-程序员宅基地

文章浏览阅读3.4k次。XSS攻击听说过,没见过,后来通过查资料了解一点,这篇文章中,主要是针对XSS攻击做一个基本的防御,我也不知道能不能防的住,防不住在加规则,中国式解决问题:哪疼医那。哈哈由于公司用的是 SpringMVC,因此,这次就主要基于 SpringMVC 来解决这些漏洞。当然,其实这些解决方案都是大同小异,对于什么环境来说根本无所谓。了解了原理,什么环境、什么语言都可以运用自如了。废话就不多说了,直接上解..._xxs全防1.0免费