添加生成的文件和生成器


You
You 2023-12-31 01:08:54 62413
分类专栏: 资讯

添加生成的文件和生成器

在这一节当中,我们会告诉你如何将一个生成的源文件加入到应用程序的构建过程中。在此例中,我们会创建一个预先计算好的平方根的表,并将这个表编译到应用程序中去。为了达到这个目的,我们首先需要一个程序来生成这样的表。在MathFunctions这个子目录下一个新的叫做MakeTable.cxx的源文件就是用来干这个的。

// 一个构建 sqrt 表的简单程序
#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 
 
int main (int argc, char *argv[]) 
{ 
  int i;
  双重结果;
 
  // 确保我们有足够的参数
  if (argc < 2) 
    { 
    return 1; 
    } 
  
  // 打开输出文件
  FILE *fout = fopen(argv[1],"w"); 
  if (!fout) 
    {
    返回 1; 
    } 
  
  // 创建一个包含平方根表的源文件
  fprintf(fout,"double sqrtTable[] = {\n"); 
  for (i = 0; i < 10; ++i) 
    {
    结果 = sqrt(static_cast<double>(i)); 
    fprintf(fout,"%g,\n",结果);
    } 
 
  // 以零关闭表
  fprintf(fout,"0};\n"); 
  fclose(fout);
  返回0;
}

注意到这张表是由一个有效的C++代码产生的,并且输出文件的名字是由参数代入的。下一步就是添加合适的命令到MathFunctions的CMakeLists文件中来构建MakeTable这个可执行程序,并且作为构建过程中的一部分。完成它需要一些命令,如下:

# 首先我们添加生成表的可执行文件 add_executable 
(MakeTable MakeTable.cxx) 
 
# 添加生成源代码的命令
add_custom_command ( 
  OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/Table.h 
  COMMAND MakeTable ${CMAKE_CURRENT_BINARY_DIR}/Table.h 
  DEPENDS MakeTable 
  ) 
 
# 将二叉树目录添加到
# 包含文件的搜索路径
include_directories( ${CMAKE_CURRENT_BINARY_DIR} ) 
 
# 添加主库
add_library(MathFunctions mysqrt.cxx ${CMAKE_CURRENT_BINARY_DIR}/Table.h )

首先,就像其它可执行程序一样,MakeTable被添加为可执行程序。然后我们添加了一个自定义命令来详细描述如何通过运行MakeTable来产生Table.h。接下来,我们需要让CMake知道mysqrt.cxx依赖于生成的文件Table.h。这是通过往MathFunctions这个库里面添加生成的Table.h来实现的。我们也需要添加当前的生成目录到搜索路径中,从而Table.h可以被mysqrt.cxx找到。

当这个工程被构建时,它首先会构建MakeTable这个可执行程序。然后运行MakeTable从而生成Table.h。最后,它会编译mysqrt.cxx来生成MathFunctions library。

在这一刻,我们添加了所有的特征到最顶层的CMakeLists文件,它现在看起来是这样的:

cmake_minimum_required (VERSION 2.6)
项目 (教程) 
 
# 版本号。
set (Tutorial_VERSION_MAJOR 1) 
set (Tutorial_VERSION_MINOR 0) 
 
# 这个系统提供log和exp功能吗?
include (${CMAKE_ROOT}/Modules/CheckFunctionExists.cmake) 
 
check_function_exists (log HAVE_LOG) 
check_function_exists (exp HAVE_EXP) 
 
# 我们应该使用我们自己的数学函数
选项(USE_MYMATH 
  "使用教程提供的数学实现" ON) 
 
# 配置一个头文件来传递一些 CMake 设置
# 到源代码
configure_file ( 
  "${PROJECT_SOURCE_DIR}/TutorialConfig.h.in" 
  "${PROJECT_BINARY_DIR}/TutorialConfig.h" 
  )
 
# 将二叉树添加到包含文件的搜索路径中
# 这样我们就可以找到TutorialConfig.h 
include_directories ("${PROJECT_BINARY_DIR}") 
 
# 添加MathFunctions 库?
if (USE_MYMATH) 
  include_directories ("${PROJECT_SOURCE_DIR}/MathFunctions") 
  add_subdirectory (MathFunctions) 
  set (EXTRA_LIBS ${EXTRA_LIBS} MathFunctions) 
endif (USE_MYMATH) 
 
# 添加可执行
文件 add_executable (教程tutorial.cxx) 
target_link_libraries (教程${EXTRA_LIBS} ) 
 
# 添加安装目标
install (TARGETS Tutorial DESTINATION bin) 
install (FILES "${PROJECT_BINARY_DIR}/TutorialConfig.h"        
         DESTINATION include) 
 
# 应用程序是否运行
add_test (TutorialRuns 教程 25) 
 
# 使用消息有效吗?
add_test (TutorialUsage Tutorial) 
set_tests_properties (TutorialUsage 
  PROPERTIES 
  PASS_REGULAR_EXPRESSION "Usage:.*number" 
  ) 
 
 
#定义一个宏来简化添加测试
宏 (do_test arg result) 
  add_test (TutorialComp${arg} Tutorial ${arg}) 
  set_tests_properties (TutorialComp${ arg} 
    PROPERTIES PASS_REGULAR_EXPRESSION ${result} 
    ) 
endmacro (do_test) 
 
# 进行一堆基于结果的测试
do_test (4 "4 is 2") 
do_test (9 "9 is 3") 
do_test (5 "5 is 2.236") 
do_test ( 7 "7 是 2.645") 
do_test(25 "25 是 5") 
do_test(-25“-25为0”)
do_test (0.0001 "0.0001 是 0.01")

网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。

本文链接:https://www.xckfsq.com/news/show.html?id=33106
赞同 0
评论 0 条
YouL0
粉丝 0 发表 582 + 关注 私信
上周热门
银河麒麟添加网络打印机时,出现“client-error-not-possible”错误提示  1487
银河麒麟打印带有图像的文档时出错  1405
银河麒麟添加打印机时,出现“server-error-internal-error”  1194
统信操作系统各版本介绍  1116
统信桌面专业版【如何查询系统安装时间】  1114
统信桌面专业版【全盘安装UOS系统】介绍  1068
麒麟系统也能完整体验微信啦!  1026
统信【启动盘制作工具】使用介绍  672
统信桌面专业版【一个U盘做多个系统启动盘】的方法  616
信刻全自动档案蓝光光盘检测一体机  526
本周热议
我的信创开放社区兼职赚钱历程 40
今天你签到了吗? 27
信创开放社区邀请他人注册的具体步骤如下 15
如何玩转信创开放社区—从小白进阶到专家 15
方德桌面操作系统 14
我有15积分有什么用? 13
用抖音玩法闯信创开放社区——用平台宣传企业产品服务 13
如何让你先人一步获得悬赏问题信息?(创作者必看) 12
2024中国信创产业发展大会暨中国信息科技创新与应用博览会 9
中央国家机关政府采购中心:应当将CPU、操作系统符合安全可靠测评要求纳入采购需求 8

添加我为好友,拉您入交流群!

请使用微信扫一扫!