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

湛江做网站开发网站建设基于

湛江做网站开发,网站建设基于,wordpress已发布不显示不出来,济南全屋定制目录 1.概述2.创建项目3 配置运行项目3.1 编写开平方根示例代码3.2 编写CMake构建脚本 4.使用子模块实现求平方根的功能4.1 在子模块中实现两种求平方根的方法4.2 构建Mathfunctions子模块4.3 在根目录引用子模块的功能4.3.1 编写构建脚本4.3.2 编写C代码使用MathFunctions库中… 目录 1.概述2.创建项目3 配置运行项目3.1 编写开平方根示例代码3.2 编写CMake构建脚本 4.使用子模块实现求平方根的功能4.1 在子模块中实现两种求平方根的方法4.2 构建Mathfunctions子模块4.3 在根目录引用子模块的功能4.3.1 编写构建脚本4.3.2 编写C代码使用MathFunctions库中提供的功能4.4 运行 5 添加可调试的功能5.1 编写子模块的CMakeLists.txt5.2 在C代码中使用USE_MYMATH变量5.3 运行代码 1.概述 平时我们开发C/C程序时都是在类似Window 的Visual Studio这类的IDE上这些IDE集成了各种好用的工具并提供了强大的代码调试和搜索等功能能够很高效的帮助我们实现我们想要的功能。既然这样那为啥我们还需要需要学习CMake的构建工具呢我学习的主要原因是我是一个Android开发者作为Android开发者熟悉jni的开发是重中之重界面开发的时代已经过去现在Android在VR领域和音视频邻域的地位逐渐的上升而这些领域无不需要jni的加持而现在的Andoid jni都是使用Cmake辅助构建的所以学习Cmkae构建工具很有必要。 在本文中我们将会学习如何使用Cmake工具创建一个项目然后介绍如何在项目中添加和使用库以及如何将我们的库设置成可以动态切换的。这里可动态切换的意思是当我们在开发环境时使用开发环境的库在生产环境时使用生产环境的库。 注意本文内容是Cmake官方练习的第二个练习读者也可以直接去官方下载练习自己动手体验 2.创建项目 当我们在集成开发环境(IDE)中创建项目特别简单只需要点击file-new project就能创建一个项目IDE会帮我们把基本的结构准备好。但是我们今天直接自己手动创建。如下图所示 在上面的截图中我们创建了一个根目录AddLibraryDemo表示整个项目的主目录在这个目录下我们创建了build目录用于存放编译后的产物创建MathFunctions表示子模块目录因为我们的项目可能会由很多的模块组成。创建CMakeLists.txt作为整个项目的构建脚本。而tutorial.cxx是本文中的演示程序TutorialConfig.h.in是为了配置动态编译生成头文件的配置文件。 接下来我们看下在子模块MathFunctions中的目录结构及配置 在MathFunctions的子模块中目录结构特别简单就是一个构建脚本CMakeLists.txt和需要演示的C文件。接下来我们就介绍下如何使用CMake配置并运行我们创建的AddLibraryDemo项目。 3 配置运行项目 首先我们先使用C编写一个简单的功能数学中的开平方根为了演示在本项目中会使用两种方式开平方根一种是使用系统标准库中的函数std::sqrt(x)另外一种是使用自己实现的开平方根的方式。这个例子来源于官网的练习题。 3.1 编写开平方根示例代码 接下来我们看下实现开平方根的例子。在我们创建的根目录下的tutorial.cxx中编写开平方根的代码代码如下所示 #include cmath #include iostream #include string #include TutorialConfig.hint main(int argc, char* argv[]) {if (argc 2) {// report versionstd::cout argv[0] Version Tutorial_VERSION_MAJOR . Tutorial_VERSION_MINOR std::endl;std::cout Usage: argv[0] number std::endl;return 1;}// convert input to doubleconst double inputValue std::stod(argv[1]);const double outputValue std::sqrt(inputValue);std::cout The square root of inputValue is outputValue std::endl;return 0; }3.2 编写CMake构建脚本 在我们的根目录下的CMakeLists.txt中编写构建命令如下所示 cmake_minimum_required(VERSION 3.10) # set the project name and version project(Tutorial VERSION 1.0)# specify the C standard set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED True) # configure a header file to pass some of the CMake settings # to the source code configure_file(TutorialConfig.h.in TutorialConfig.h) # add the executable add_executable(Tutorial tutorial.cxx) # add the binary tree to the search path for include files # so that we will find TutorialConfig.h target_include_directories(Tutorial PUBLIC${PROJECT_BINARY_DIR})进入我们之前创建的build目录下输入如下命令编译项目 cmake .. cmake --build .编译结果 然后输入命令Tutorial.exe 100 运行结果如下 在这个开平方根的例子中我们使用了系统标准库中的std::sqrt(x)我们首先从控制台获取用户输入的值并做合法性验证最后输出开平方根后的值。 #include TutorialConfig.h 这个头文件是编译动态生成的我们在CMakeLists,txt 中会配置也就是结合TutorialConfig.h.in文件生成的让我们在项目中可以使用Tutorial_VERSION_MAJOR这个我们在CMakeLists.txt中配置的值 4.使用子模块实现求平方根的功能 上面的内容演示了如何实现求平方的功能如我们所见源代码都放在了根目录下项目很小的时候这样做也没啥问题但是当项目变得很大的时候大量的源代码会让维护变得困难并且CMake构建脚本会变得很复杂为了解决这个问题我们可以使用子模块的方法就是把整个项目的功能拆分成一个个的子模块在根目录下只负责整合编译构建这些子模块每个子模块拥有自己的编译脚本负责本模块的编译工作。这样的话整个项目的可维护性就变好了接下来我们看下如何在项目中使用CMake工具添加子模块这里需要用到一个新的CMake命令add_subdirectory(子模块目录) 4.1 在子模块中实现两种求平方根的方法 在我们新建的子模块MathFunctions中我们实现两种求平方根的方法一种是使用标准库中的std::sqrt(x)函数另外一种是自己编写算法实现如下所示 1 使用标准库中的sqrt函数 MathFunctions.h #pragma once namespace mathfunctions { double sqrt(double x); } MathFunctions.cpp #include MathFunctions.h #include cmath namespace mathfunctions { double sqrt(double x) {return std::sqrt(x); } }(2)使用自己编写的函数mysqrt mysqrt.h #pragma once namespace mathfunctions { namespace detail { double mysqrt(double x); } }mysqrt.cpp #include mysqrt.h #include iostream namespace mathfunctions { namespace detail { double mysqrt(double x) {if (x 0) {return 0;}double result x;// do ten iterationsfor (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 Computing sqrt of x to be result std::endl;}return result; } } }将上面的源代码放到子模块Mathfunctions下如下所示 说明c的文件后缀.cxx 和.cpp都是表示C文件。 4.2 构建Mathfunctions子模块 在MathFunctions的CMakeLIsts.txt中编写构建命令将MathFunctions子模块构建成一个库供其他模块使用。只需要使用add_library()命令就可以将当前目录下的C文件构建成一个库如下所示 add_library(MathFunctions MathFunctions.cxx mysqrt.cxx)上面的代码中将MathFunctions.cxx mysqrt.cxx两个C文件的源代码编译构建成一个名为MathFunctions的静态库如下图所示 注意使用静态库时我们可以不用写名字前面的lib以及后缀.a, 例如本例中的libMathFunctions.a我们使用的时候直接用MathFunctions就可以引用到这个库了 后面可以通过这个名字引用这个库进而可以使用这个库中的功能。 4.3 在根目录引用子模块的功能 当我们把子模块编译构建好了后就会生成一个名为MathFunctions的库接下来我们就在根目录下引用这个库实现求平方根的功能。 4.3.1 编写构建脚本 首先是在构建脚本CMakeLists.txt中引入这个库如下所示 cmake_minimum_required(VERSION 3.10) # set the project name and version project(Tutorial VERSION 1.0)# specify the C standard set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED True)# configure a header file to pass some of the CMake settings # to the source code configure_file(TutorialConfig.h.in TutorialConfig.h)# Use add_subdirectory() to add MathFunctions to this project add_subdirectory(MathFunctions) # add the executable add_executable(Tutorial tutorial.cxx) # Use target_link_libraries to link the library to our executable target_link_libraries(Tutorial PUBLIC MathFunctions) # Add MathFunctions to Tutorials target_include_directories() # Hint: ${PROJECT_SOURCE_DIR} is a path to the project source.AKA This folder! # add the binary tree to the search path for include files # so that we will find TutorialConfig.h target_include_directories(Tutorial PUBLIC${PROJECT_BINARY_DIR}${PROJECT_SOURCE_DIR}/MathFunctions)如上面的代码所示我们使用add_subdirectory(MathFunctions)将子模块MathFunctions添加到我们的根目录下在其他模块中想要引用MathFunctions的功能也是这么做接下来编译整个项目的时候会连子模块MathFuncitons一起编译这时会生成静态库libMathFunctions.a文件我们使用target_link_libraries(Tutorial PUBLIC MathFunctions) 命令来链接我们的静态库然后再将子模块中的路径配置到根目录的CMakeLists.txt中方便找到对应的文件使用的命令是 target_include_directories(Tutorial PUBLIC${PROJECT_BINARY_DIR}${PROJECT_SOURCE_DIR}/MathFunctions)4.3.2 编写C代码使用MathFunctions库中提供的功能 在根目录的tutorial.cxx文件中修改求平方根的代码使用MathFunctions库中提供的功能。如下所示 #include cmath #include iostream #include string#include TutorialConfig.h #include MathFunctions.hint main(int argc, char* argv[]) {if (argc 2) {// report versionstd::cout argv[0] Version Tutorial_VERSION_MAJOR . Tutorial_VERSION_MINOR std::endl;std::cout Usage: argv[0] number std::endl;return 1;}// convert input to doubleconst double inputValue std::stod(argv[1]);const double outputValue mathfunctions::sqrt(inputValue);std::cout The square root of inputValue is outputValue std::endl;return 0; } 上面的代码中我们使用了#include MathFunctions.h 引入了在子模块中定义的头文件然后使用const double outputValue mathfunctions::sqrt(inputValue); 求取平方根的值 4.4 运行 在本节的开头提到使用两种方法求平方根一种是标准库中的一种是我们自己实现的如果我们要在这两种方法中切换有两种办法一种是修改调用方的代码即修改Turtorial.cxx中的代码这种做法通常不可取因为如果我们提供功能需要调用方去做很多修改的话还不如不提供。所以这种方法不可取另外一种方法是在库里面修改给调用方提供一个接口。 在本项目中我们需要修改的地方就是子模块的MathFunctions.cxx文件 #include MathFunctions.h #include cmath #include mysqrt.hnamespace mathfunctions { double sqrt(double x) {// return detail::mysqrt(x); // 使用自定义的函数return std::sqrt(x); // 使用标准库中的函数 } }我们可以修改上面的代码构建项目。运行结果如下 1使用标准库中的函数 2使用自定义的函数 5 添加可调试的功能 在上面的内容中介绍了添加子模块的库并调用库中的功能本节就是本文的主要内容实现开发环境和生产环境的分离。如此一来开发者就可以自己选择是使用系统提供的求平方根函数还是使用自己实现的函数。这种方式特别适合用于调试程序。实现这一个功能可以使用CMake提供的option()命令使用这个命令开发者可以定义一个变量去表示开发或者是生产环境或者是使用某个库的标志设置了后我们就可以通过改变我们定义的变量的值去动态切换我们的函数实现了。 5.1 编写子模块的CMakeLists.txt 要实现可动态切换我们的函数实现的功能需要我们在构建脚本中编写对应的代码步骤如下 首先使用option()命令定义一个变量USE_MYMATH并设置其值为ON表示使用我们自定义的函数为OFF则使用系统提供的函数 // MathFunctions/CMakeLists.txt option(USE_MYMATH use my math implementation ON)然后我们使用if()语句来判断USE_MYMATH 的值并且使用target_compile_definitions()命令来开启或者关闭我们的源代码编译选项。如下所示 // MathFunctions/CMakeLists.txt if(USE_MYMATH)target_compile_definitions(MathFunctions PRIVATE USE_MYMATH) endif()这时候的MathFunctions/CMakeLists.txt就如下所示 // MathFunctions/CMakeLists.txt option(USE_MYMATH use my math implementation ON) add_library(MathFunctions MathFunctions.cxx mysqrt.cxx)if(USE_MYMATH)target_compile_definitions(MathFunctions PRIVATE USE_MYMATH)endif()上面的代码中我们会发现如果USE_MYMATH的值变成了OFF即不需要使用我们自定义的函数时本不应该再让mysqrt.cxx文件参与编译因为我们根本没使用它的功能这里可以将我们自己实现的功能单独编译成一个静态库并且在if()语句块里面链接这个库代码如下所示 // MathFunctions/CMakeLists.txt option(USE_MYMATH use my math implementation ON) add_library(MathFunctions MathFunctions.cxx)add_library(SqrtLibrary STATIC mysqrt.cxx)if(USE_MYMATH)target_link_libraries(MathFunctions PRIVATE SqrtLibrary)target_compile_definitions(MathFunctions PRIVATE USE_MYMATH) endif()至此我们的CMake构建脚本就编写好了 5.2 在C代码中使用USE_MYMATH变量 要想实现动态切换我们的两种开平方根功能的实现仅仅编写构建脚本还不够构建脚本只能告诉编译器该构建哪些文件具体需要实现的功能还是得修改具体的实现代码在C代码中我们可以直接使用我们定义的USE_MYMATH变量来觉得使用的实现函数。如下所示 #include MathFunctions.h #include cmath #ifdef USE_MYMATH#include mysqrt.h #endifnamespace mathfunctions { double sqrt(double x) {#ifdef USE_MYMATHreturn detail::mysqrt(x); // 使用自定义的函数#elsereturn std::sqrt(x); // 使用标准库中的函数#endif } }如上面的代码所示如果我们定义了USE_MYMATH这个变量那么就使用自定义的求平方根函数否则使用标准库的求平方根函数 5.3 运行代码 当代码都编写完成后我们可以进入build目录然后使用命令 cmake ..编译项目编译完成后使用: cmake --build .构建项目构建玩成后使用下面命令运行项目 Tutorial.exe 100这时因为默认的实现时使用我们自定义的求平方根方法假如我们想切换求平方根的方法为系统提供的则运行下面的命令 cmake .. -DUSE_MYMATHOFF然后再运行 cmake --build .构建项目接着运行 Tutorial.exe 100查看运行结果所有的运行结果如下所示 至此本文结束。
http://www.dnsts.com.cn/news/194924.html

相关文章:

  • 软件免费网站大全gofair外贸建站
  • 网站制作在哪找印刷设计公司起名
  • 淘客网站要怎么做学做窗帘的网站
  • 长沙网站建设王道下拉惠二建证书查询官网入口
  • 营销网站的类型深圳网页设计网站制作
  • 南阳网站托管制作企业网站得多长时间
  • 网站开发的流程 知乎wordpress 当前页面
  • 做企业网站的尺寸是多少中建一共几个局
  • 普通网站建设费用怎样制作简单的网页
  • 网站动态好还是静态好东莞行业网站建设教程
  • 开锁行业在58做网站有活吗jeecg 做网站
  • 做区块链在哪个网站代理网页浏览
  • 织梦摄影网站源码企业网站建设方案如何写
  • 怎样用西瓜影音做网站asp.net网站建设论文
  • 中山网站改版wordpress添加主题后怎么添加内容
  • 北京网站建设工作室哪家好营销型网站有哪些app
  • 新上线网站如何做搜索引擎电子商务网络营销是什么
  • 网站联盟是什么意思个人营业执照查询系统
  • 全国公路建设信用网站上海专业高端网站建设服务器
  • 网站三要素valenti wordpress
  • 网站建设培训公司排名黄梅戏网页制作素材
  • 建微网站有什么好处一个网站服务器多少钱
  • 网站的栏目是什么河南平台网站建设价位
  • php快速建网站吉林关键词优化的方法
  • 网站建设调研报告中国铁建最新消息
  • 重庆智慧团建网站登录平台wordpress的文章tag标签
  • 如何做Google外贸网站wordpress文章分类权限
  • 网站怎么设置标题宁波网站设计企业
  • 扬州高邮网站建设酒店网站素材
  • 一 通过网站推广品牌黄岛网站开发