博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(5)CMake入门笔记--CMake官网教程
阅读量:2173 次
发布时间:2019-05-01

本文共 4610 字,大约阅读时间需要 15 分钟。

五.添加生成的文件和生成器

在本节中,我们将展示如何将生成的源文件添加到应用程序的构建过程中。 对于此示例,我们将创建一个预先计算的平方根表,作为构建过程的一部分,然后将该表编译到我们的应用程序中。 为此,我们首先需要一个生成表的程序。 在MathFunctions子目录中,一个名为MakeTable.cxx的新源文件就是这样做的。

// A simple program that builds a sqrt table#include 
#include
#include
int main (int argc, char *argv[]){  int i;  double result;  // make sure we have enough arguments  if (argc < 2)  {    return 1;  }  // open the output file  FILE *fout = fopen(argv[1],"w");  if (!fout)  {    return 1;  }  // create a source file with a table of square roots  fprintf(fout,"double sqrtTable[] = {\n");  for (i = 0; i < 10; ++i)  {    result = sqrt(static_cast
(i));    fprintf(fout,"%g,\n",result);  }  // close the table with a zero  fprintf(fout,"0};\n");  fclose(fout);  return 0;}

请注意,该表是作为有效的C ++代码生成的,并且将输出的文件的名称作为参数传入。 下一步是将适当的命令添加到MathFunctions的CMakeLists.txt文件以构建MakeTable可执行文件,然后在构建过程中运行它。 完成此操作需要一些命令,如下所示。

# first we add the executable that generates the tableadd_executable(MakeTable MakeTable.cxx)# add the command to generate the source codeadd_custom_command (  OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/Table.h  COMMAND MakeTable ${CMAKE_CURRENT_BINARY_DIR}/Table.h  DEPENDS MakeTable  )# add the binary tree directory to the search path for# include filesinclude_directories( ${CMAKE_CURRENT_BINARY_DIR} )# add the main libraryadd_library(MathFunctions mysqrt.cxx ${CMAKE_CURRENT_BINARY_DIR}/Table.h  )

首先添加MakeTable的可执行文件。 然后我们添加一个自定义命令,指定如何通过运行MakeTable来生成Table.h。 接下来我们要让CMake知道mysqrt.cxx依赖于生成的文件Table.h。 这是通过将生成的Table.h添加到库MathFunctions的源列表中完成的。 我们还必须将当前二进制目录添加到包含目录列表中,以便可以在mysqrt.cxx中找到并包含Table.h。 构建此项目时,它将首先构建MakeTable可执行文件(DEPENDS MakeTable的作用,如果可执行已有则可以没有这句话)。 然后它将运行MakeTable以生成Table.h。 最后,它将编译包含Table.h的mysqrt.cxx以生成MathFunctions库。 此时,顶级CMakeLists.txt文件包含我们添加的所有功能,如下所示:

cmake_minimum_required (VERSION 2.6)project (Tutorial)include(CTest)# The version number.set (Tutorial_VERSION_MAJOR 1)set (Tutorial_VERSION_MINOR 0)# does this system provide the log and exp functions?include (${CMAKE_ROOT}/Modules/CheckFunctionExists.cmake)check_function_exists (log HAVE_LOG)check_function_exists (exp HAVE_EXP)# should we use our own math functionsoption(USE_MYMATH  "Use tutorial provided math implementation" ON)# configure a header file to pass some of the CMake settings# to the source codeconfigure_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.hinclude_directories ("${PROJECT_BINARY_DIR}")# 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 executableadd_executable (Tutorial tutorial.cxx)target_link_libraries (Tutorial  ${EXTRA_LIBS})# add the install targetsinstall (TARGETS Tutorial DESTINATION bin)install (FILES "${PROJECT_BINARY_DIR}/TutorialConfig.h"                DESTINATION include)# does the application runadd_test (TutorialRuns Tutorial 25)# does the usage message work?add_test (TutorialUsage Tutorial)set_tests_properties (TutorialUsage  PROPERTIES  PASS_REGULAR_EXPRESSION "Usage:.*number"  )#define a macro to simplify adding testsmacro (do_test arg result)  add_test (TutorialComp${arg} Tutorial ${arg})  set_tests_properties (TutorialComp${arg}    PROPERTIES PASS_REGULAR_EXPRESSION ${result}    )endmacro (do_test)# do a bunch of result based testsdo_test (4 "4 is 2")do_test (9 "9 is 3")do_test (5 "5 is 2.236")do_test (7 "7 is 2.645")do_test (25 "25 is 5")do_test (-25 "-25 is 0")do_test (0.0001 "0.0001 is 0.01")TutorialConfig.h.in如下:// the configured options and settings for Tutorial#define Tutorial_VERSION_MAJOR @Tutorial_VERSION_MAJOR@#define Tutorial_VERSION_MINOR @Tutorial_VERSION_MINOR@#cmakedefine USE_MYMATH// does the platform provide exp and log functions?#cmakedefine HAVE_LOG#cmakedefine HAVE_EXP

MathFunctions的CMakeLists.txt文件如下所示:

# first we add the executable that generates the tableadd_executable(MakeTable MakeTable.cxx)# add the command to generate the source codeadd_custom_command (  OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/Table.h  DEPENDS MakeTable  COMMAND MakeTable ${CMAKE_CURRENT_BINARY_DIR}/Table.h  )# add the binary tree directory to the search path# for include filesinclude_directories( ${CMAKE_CURRENT_BINARY_DIR} )# add the main libraryadd_library(MathFunctions mysqrt.cxx ${CMAKE_CURRENT_BINARY_DIR}/Table.h)install (TARGETS MathFunctions DESTINATION bin)install (FILES MathFunctions.h DESTINATION include)

 

转载地址:http://bqhzb.baihongyu.com/

你可能感兴趣的文章
程序员--学习之路--技巧
查看>>
解决问题之 MySQL慢查询日志设置
查看>>
contOS6 部署 lnmp、FTP、composer、ThinkPHP5、docker详细步骤
查看>>
TP5.1模板布局中遇到的坑,配置完不生效解决办法
查看>>
PHPstudy中遇到的坑No input file specified,以及传到linux环境下遇到的坑,模板文件不存在
查看>>
TP5.1事务操作和TP5事务回滚操作多表
查看>>
composer install或composer update 或 composer require phpoffice/phpexcel 失败解决办法
查看>>
TP5.1项目从windows的Apache服务迁移到linux的Nginx服务需要注意几点。
查看>>
win10安装软件 打开时报错 找不到 msvcp120.dll
查看>>
PHPunit+Xdebug代码覆盖率以及遇到的问题汇总
查看>>
PHPUnit安装及使用
查看>>
PHP项目用xhprof性能分析(安装及应用实例)
查看>>
composer安装YII
查看>>
Sublime text3快捷键演示
查看>>
sublime text3 快捷键修改
查看>>
关于PHP几点建议
查看>>
硬盘的接口、协议
查看>>
VLAN与子网划分区别
查看>>
Cisco Packet Tracer教程
查看>>
02. 交换机的基本配置和管理
查看>>