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

智能推荐

ctags 和Makefile的简单使用-程序员宅基地

文章浏览阅读141次。ctagsctags是vim下方便代码阅读的工具。尽管ctags也可以支持其它编辑器,但是它正式支持的只有VIM。并且VIM中已经默认安装了Ctags,它可以帮助程序员很容易地浏览源代码。(尤其是大型的工程)一、安装ctags1、命令行安装切换到root用户之下,输入yum install ctags2、下载源码安装(网上提供的方法) 1)从http://ctag..._ctags makefile

Vue+Element ui 根据后台返回数据设置动态表头_vue+element怎么存储定义的表头数据-程序员宅基地

文章浏览阅读6.6k次,点赞6次,收藏31次。&amp;amp;amp;amp;amp;lt;el-table class=&amp;amp;amp;amp;quot;tb-edit&amp;amp;amp;amp;quot; highlight-current-row :data=&amp;amp;amp;amp;quot;table_orderStatistic&amp;amp;amp;amp;quot; border style=&amp;amp;amp;amp;quot;width: 100_vue+element怎么存储定义的表头数据

eclipse导入多模块modules的maven项目_eclipse 导入多模块maven项目-程序员宅基地

文章浏览阅读4.8k次。1、在 eclipse 中检出项目右键 --》Import --》Git --》 Projects from Git --》 Clone URL --》 http://XXX.git --》Next --》Directory(选择代码存放位置)--》勾选Import as general project --》Finish2、转为Maven项目选中检出的项目右键 --》 ..._eclipse 导入多模块maven项目

postman在接口请求之前先请求其他接口_postman怎么在请求前调用上一个request请求-程序员宅基地

文章浏览阅读2.9k次,点赞2次,收藏6次。前置条件_postman怎么在请求前调用上一个request请求

[置顶] JAVA识别身份证号码,H5识别身份证号码,tesseract-ocr识别(一)(转)-程序员宅基地

文章浏览阅读135次。背景介绍:这段时间正在做一个流动人口管理项目,其中要求使用H5网页拍照识别身份证,当时就蒙圈了,这不是APP的功能吗?产品为了快速迭代一直把APP的功能往H5上堆砌,没办法只有想办法解决了。查了一些资料,发现除了收费的OCR(百度、云脉等等)比较好的并支持中文的就只有tesseract了,当然我收费的OCR我也没测试。暂时决定使用tesseract了。思路介绍我的思路是这样的:由..._java 身份证图片号码识别

iOS 实现二维码的彩色效果_ios 二维码美化-程序员宅基地

文章浏览阅读2.9k次。今天做项目基本是完成了,测试也进入尾声,同事给我说要我把二维码变成彩色的,我对着原来前辈写的工程研究来研究去,找了很多资料还是没弄好,还是一直失败,于是找了一下我同学,问了一下他,结果他上班没时间帮我看,但是却帮我开了脑洞,我突然发现自己太死板了,死磕在原来代码上,其实到github上搜一搜有很多写好的代码供我使用,但是我没有想到,工作是讲究效率的,学习可以死磕,但是工作上一定要头脑灵活,学会使用_ios 二维码美化

随便推点

苹果手机相册怎么分类_手机相册照片太多最后只能落得删除的下场?学学怎么做电子相册吧...-程序员宅基地

文章浏览阅读327次。不知道现在的你是否还仅仅只会将自己所拍摄的照片以图片的形式分享给他人?有没有看见别人将自己的照片做成视频然后加上特效再发放出来,为什么他们的视频就做得这么好呢。同样在暑假期间,很多人也都乘着这个大长假去外面游玩,照片拍的太多占手机内存,之后怎么办,又要删除吗?那照片拍得还有什么意义?其实完全可以将照片做成视频,这样大幅减少照片数量,还不会被手机中过多的照片所看花。所以今天来给大家讲一讲照片变成视频..._iphone12手机相册分类的时候不能减数量吗

前端开发之SEO(搜索引擎优化)_前端seo优化-程序员宅基地

文章浏览阅读4.8k次,点赞7次,收藏63次。此文章是我看到两篇总结得非常好的文章,但怕之后链接失效,就复制了大部分内容,并对其中一些内容做了些修改或补充。原链接在结尾处。SEO(search engine optimization),传说中的搜索引擎优化。是指为了增加网页在搜索引擎自然搜索结果中的收录数量以及提高网站排名而做的优化行为。作为前端开发工程师,你不需要精通SEO,但你必须要了解它。它没有一成不变的方案供大家套用,但总有一些人们公认的规律可以对网站进行SEO。更重要的是我们要有自己的实践,不断发现适合自己行之有效的SEO方法。_前端seo优化

怎样修改ubuntu的主机名_ubuntu修改机器名-程序员宅基地

文章浏览阅读2.3k次。 修改ubuntu的主机名首先确定主机名就是@后面的东西vi 编辑器就可以修改vi /etc/hostname _ubuntu修改机器名

quasar 路由笔记_quasar router-程序员宅基地

文章浏览阅读2.4k次。quasar与vue-cli相似,在这里整理一个关于quasar路由的笔记一、路由配置实现页面跳转1.quasar的文件大概如下,我的路由配置放在router目录里2.这里我配置两个路由,首页home、登录页login,首页配置在文件static.js里,登录页配置在root.js里。首页statics.jsexport default [ // 首页 { name: 'home', path: '', component: () => imp_quasar router

解决Java运行时错误For input string:问题-程序员宅基地

文章浏览阅读3.4w次,点赞12次,收藏12次。其实问题都比较简单,只要你多花点功夫去研究原理。你发现其实都差不多的。没有什么东西是很难的_for input string:

文件权限详解-程序员宅基地

文章浏览阅读1k次,点赞10次,收藏7次。ll指令查看文件详细信息中,第一列就是文件类型。常见的文件类型有:1、 - :普通文件 (文本、源代码、图片、视频、可执行)2、 d :目录文件3、b :块设备4、c :字符设备5、l:链接文件6、p:管道文件7、s:socket文件。_文件权限