当前位置: 首页 > news >正文

企业网站设计多少钱淄博网站公司

企业网站设计多少钱,淄博网站公司,公司网站域名实名认证怎么做,百度一下你就知道原版步4:安装与测试 现在开始给项目添加安装规则和支持测试. 安装规则 安装规则非常简单:对MathFunctions,想安装库和头文件,对应用,想安装可执行文件和配置头. 所以在MathFunctions/CMakeLists.txt尾添加: install(TARGETS MathFunctions DESTINATION lib) install(FILES Mat…

步4:安装与测试

现在开始给项目添加安装规则和支持测试.

安装规则

安装规则非常简单:对MathFunctions,想安装库和头文件,对应用,想安装可执行文件和配置头.

所以在MathFunctions/CMakeLists.txt尾添加:

install(TARGETS MathFunctions DESTINATION lib)
install(FILES MathFunctions.h DESTINATION include)

在顶层CMakeLists.txt尾添加:

install(TARGETS Tutorial DESTINATION bin)
install(FILES "${PROJECT_BINARY_DIR}/TutorialConfig.h"DESTINATION include
)

就完成了本地安装.

现在运行cmakecmake-gui来配置项目并构建.
然后在命令行中运行cmakeinstall选项来执行安装步骤(3.15引入).

多配置工具,记得用--config来指定配置.如果用IDE,直接构建INSTALL目标即可.这一步会安装适合的头文件,库和可执行文件:

camke --install .

CMakeCMAKE_INSTALL_PREFIX变量确定安装文件的根目录.如果使用cmake --install命令,可用--prefix参数覆盖安装前缀:

cmake --install . --prefix "/home/myuser/installdir"

浏览安装目录,然后验证是否可运行安装的Tutorial.

支持测试

接着测试应用,在顶级CMakeLists.txt尾,可打开测试功能,然后加一些基本测试来验证是否正确安装.

enable_testing()
//是否运行`应用`
add_test(NAME Runs COMMAND Tutorial 25)
//使用消息是否工作?
add_test(NAME Usage COMMAND Tutorial)
set_tests_properties(UsagePROPERTIES PASS_REGULAR_EXPRESSION "Usage:.*number"
)
//定义简化加测试的函数
function(do_test target arg result)add_test(NAME Comp${arg} COMMAND ${target} ${arg})set_tests_properties(Comp${arg}PROPERTIES PASS_REGULAR_EXPRESSION ${result}
)
endfunction(do_test)//测试
do_test(Tutorial 4 "4 is 2")
do_test(Tutorial 9 "9 is 3")
do_test(Tutorial 5 "5 is 2.236")
do_test(Tutorial 7 "7 is 2.645")
do_test(Tutorial 25 "25 is 5")
do_test(Tutorial -25 "-25 is [-nan|nan|0]")
do_test(Tutorial 0.0001 "0.0001 is 0.01")

多配置生成器,要用-C来指定配置类型.

ctest -C Debug -VV
ctest -C Release -VV

或也可在IDE中构建RUN_TESTS目标.

步5:增加系统自检

现在想在项目中增加一些目标平台可能没有依赖代码.如,要加入代码依赖目标平台是否有logexp函数.

如果平台logexp,则就在mysqrt函数里使用.首先在顶层CMakeLists.txt里用CheckSymbolExists测试是否有这些函数?

一些平台,如果没有logexp,就需要连接到m库.

include(CheckSymbolExists)
check_symbol_exists(log "math.h" HAVE_LOG)
check_symbol_exists(exp "math.h" HAVE_EXP)
if(NOT (HAVE_LOG AND HAVE_EXP))unset(HAVE_LOG CACHE)unset(HAVE_EXP CACHE)set(CMAKE_REQUIRED_LIBRARIES "m")check_symbol_exists(log "math.h" HAVE_LOG)check_symbol_exists(exp "math.h" HAVE_EXP)if(HAVE_LOG AND HAVE_EXP)target_link_libraries(MathFunctions PRIVATE m)endif()
endif()

现在给TutorialConfig.h.in添加一些定义,这样就可在mysqrt.cxx里使用了:

//平台是否提供`exp`和`log`功能?
#cmakedefine HAVE_LOG
#cmakedefine HAVE_EXP

如果在系统上可用logexp,则在mysqrt里使用它们.在MathFunctions/mysqrt.cxx里的mysqrt里添加下述代码(别忘了返回值前加#endif):

#if defined(HAVE_LOG) && defined(HAVE_EXP)double result = exp(log(x) * 0.5);std::cout << "Computing sqrt of " << x << " to be " << result<< " 用log和exp" << std::endl;
#elsedouble result = x;

还要修改mysqrt.cxx来包含cmath:

#include <cmath>

运行cmakecmake-gui来配置项目,然后构建并执行Tutorial.

会注意到没用logexp,即使认为它们应该是可用的.很容易发现,在mysqrt.cxx中忘记包含TutorialConfig.h了.

也需要更新MathFunctions/CMakeLists.txt,这样mysqrt.cxx才可定位文件:

target_include_directories(MathFunctionsINTERFACE${CMAKE_CURRENT_SOURCE_DIR}PRIVATE${CMAKE_BINARY_DIR}
)

更新后,继续构建项目,然后运行Tutorial.如果仍没有使用logexp,打开构建目录下的生成的Tutorial.h文件,可能他们在当前系统下不可用的.

那个函数目前结果更好呢,sqrt还是mysqrt?

指定编译定义

除了在TutorialConfig.h中存储HAVE_LOGHAVE_EXP外,还有更好的地方么?试试用target_compile_definitions().

首先在TutorialConfig.h中移除定义,不再需要从mysqrt.cxx中包含TutorialConfig.h或在MathFunctions/CMakeLists.txt中额外包含它了.
接着可把HAVE_LOGHAVR_EXP的检查移动到MathFunctions/CMakeLists.txt中,然后把这些值设置为PRIVATE编译定义.

include(CheckSymbolExists)
check_symbol_exists(log "math.h" HAVE_LOG)
check_symbol_exists(exp "math.h" HAVE_EXP)
if(NOT (HAVE_LOG AND HAVE_EXP))unset(HAVE_LOG CACHE)unset(HAVE_EXP CACHE)set(CMAKE_REQUIRED_LIBRARIES "m")check_symbol_exists(log "math.h" HAVE_LOG)check_symbol_exists(exp "math.h" HAVE_EXP)if(HAVE_LOG AND HAVE_EXP)target_link_libraries(MathFunctions PRIVATE m)endif()
endif()//添加编译定义
if(HAVE_LOG AND HAVE_EXP)target_compile_definitions(MathFunctionsPRIVATE "HAVE_LOG" "HAVE_EXP")
endif()

调整更新后,重构项目,再运行Tutorial并确认结果.

步6:添加自定义命令和生成文件

现在,决定不想再用平台的logexp函数,并想生成一些会在mysqrt函数里使用到的预计算值表.

这里,创建该表并作为构建的一步,然后编译到应用中.

首先,移除MathFunctions/CMakeLists.txt中的检查logexp.然后移除mysqrt.cxx检查对HAVE_LOGHAVR_EXP.同时,也可移除#include <cmath>.

MathFunctions子目录下,有个MakeTable.cxx新文件来生成表格.

浏览该文件,可发现,表格C++代码生成的,且通过参数传入输出文件名.

下一步是在MathFunctions/CMakeLists.txt中添加合适命令来构建MakeTable可执行文件,然后作为构建流程的一部分来运行.

需要一些命令来完成这一步.
首先,在MathFunctions/CMakeLists.txt的开头,添加MakeTable可执行文件目标.

add_executable(MakeTable MakeTable.cxx)

然后添加一项定义命令指定如何运行MakeTable创建表格.

add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/Table.hCOMMAND MakeTable ${CMAKE_CURRENT_BINARY_DIR}/Table.hDEPENDS MakeTable
)

接着要让CMake知道mysqrt.cxx依赖创建的Table.h.把生成Table.h添加到MathFunctions库的源列表.

add_library(MathFunctionsmysqrt.cxx${CMAKE_CURRENT_BINARY_DIR}/Table.h
)

现在使用生成表,首先,修改mysqrt.cxx来包含Table.h,然后重写mysqrt函数以使用这张表:

double mysqrt(double x)
{if (x <= 0) {return 0;}//使用该表帮助查找初值double result = x;if (x >= 1 && x < 10) {std::cout << "用表" << std::endl;result = sqrtTable[static_cast(x)];}//十次迭代for (int i = 0; i < 10; ++i) {if (result <= 0) {result = 0.1;}double delta = x - (result * result);result = result + 0.5 * delta / result;std::cout << "计算" << x << "为" << result << std::endl;}return result;
}

运行cmakecmake-gui来配置项目并构建.
构建项目时,首先构建的是MakeTable,然后会运行MakeTable并创建Table.h.最后编译包含了Table.hmysqrt.cxx来创建MathFunctions库.

运行Tutorial可执行文件,然后验证使用了表格.

http://www.yayakq.cn/news/643199/

相关文章:

  • 北京定制网站建设公司做化学合成的网站有哪些
  • 易展 网站建设兰州手机网站建设
  • 建筑导航网站医院行业网站
  • 淘宝app官网杭seo网站建设排名
  • 设计了网站首页杭州有哪些做网站的公司好
  • 做亚马逊网站需要租办公室吗值得玩的网页游戏
  • nodejs做网站还是app夸克搜索引擎
  • 做电销哪些网站可以找到客户端永久开源的免费建站系统
  • 建立英文网站星巴克seo网络推广
  • 优化怎么做网页搜索引擎优化技术
  • 广电基础设施建设官方网站网站换服务器对排名有影响吗
  • 深圳建设工程招投标网站常熟seo关键词优化公司
  • 外贸网站建站方案建设商场黄金网站
  • 网站是如何制作的wordpress插件 速度
  • 时代强个人网站中国风网站建设
  • 罗湖建网站公司上海包装设计公司排名
  • 网站的优化是什么有哪些网站的搜索引擎
  • 公司做网站算什么费用苏州工业园区外国语学校
  • 岳阳建设网站徐州网站简介
  • 特价锦州网站建设山东3个中高风险地区
  • 小公司网站建设现状设计说明书
  • 手机做图纸app下载网站wordpress汉化.po
  • 东莞app培训网站建设设计师主题 wordpress
  • 网站标题栏制作淘宝网页网站
  • 同样是div 怎么有些网站收录少 有些多软件开发工具具有哪些基本功能
  • 网站搭建 主机推荐wordpress 页面重定向循环
  • 生产建设兵团第三师政务网站汕头企业网站建设服务
  • 网站建设的公司价格常州模板网站建设
  • 90后小姑娘做网站建一个在线商城网站
  • 商城开发网站四省网站建设