2401cmake,学习cmake3

步7:构建安装器.

下一步,假定想要发布项目,以便其他人可用.想在多种平台上发布二进制和源码.这和第四步有所不同.

第四步安装的是从源码构建的二进制.本例中,会构建支持二进制安装和包管理特性安装包.为此,使用CPack来生成对应平台的安装器.

即,需要在顶级CMakeLists.txt底添加几行:

include(InstallRequiredSystemLibraries)
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/License.txt")
set(CPACK_PACKAGE_VERSION_MAJOR "${Tutorial_VERSION_MAJOR}")
set(CPACK_PACKAGE_VERSION_MINOR "${Tutorial_VERSION_MINOR}")
include(CPack)

就这样就可以了.通过包含InstallRequiredSystemLibraries来开始.这一模块会包含项目所需当前平台的运行库.下一步在存储项目许可和版本信息的位置,设置一些CPack变量.

先前已设置好了版本信息.这一步在顶级源目录中包含license.txt.

最后,包含CPackmodule.CPack模块会用这些变量和当前系统的其他变量来配置安装器.

下一步,与正常一样,构建项目然后运行cpack可执行文件.

binary目录下运行以下命令以构建二进制发布:

cpack

-G选项来指定生成器,对多配置构建,用-C来指定配置,如:

cpack -G ZIP -C Debug

为了构建源码发布,可:

cpack --config CPackSourceConfig.cmake

或运行makepackage,或在IDE中右键Package目录然后BuildProject.
运行二进制目录中的安装器,然后运行安装可执行文件并验证可运行.

步8:增加支持Dashboard

添加把测试提交到仪表盘的支持是很简单的.在支持测试一步中,已给项目定义了一系列测试.现在只需要运行这些测试,并提交他们到仪表盘上即可.

为了支持仪表盘,在顶级CMakeLists.txt里包含CTest模块.

//启用测试
enable_testing()

替换为

//启用仪表板脚本
include(CTest)

CTest模块会自动调用enable_testing(),所以可从CMake文件里移除这一语句.

还要在顶级目录下(指定项目名并提交到面板目录),创建CTestConfig.cmake文件.

set(CTEST_PROJECT_NAME "CMakeTutorial")
set(CTEST_NIGHTLY_START_TIME "00:00:00 EST")
set(CTEST_DROP_METHOD "http")
set(CTEST_DROP_SITE "my.cdash.org")
set(CTEST_DROP_LOCATION "/submit.php?project=CMakeTutorial")
set(CTEST_DROP_SITE_CDASH TRUE)

ctest可执行文件,会在运行时读取该文件.可运行cmakecmake-gui配置项目,但是不构建项目,来创建简单面板.切换到二进制树目录下然后运行:

ctest [-VV] -C Debug -D Experimental

或在IDE中构建Experimental目标.

ctest可执行文件会构建和测试项目,并提交结果Kitware的公共面板:https://my.cdash.org/index.php?project=CMakeTutorial.

步9:混合静态和共享

展示BUILD_SHARED_LIBS变量是如何控制add_library().且允许控制构建无显式类型(STATIC,SHAREDMODULEOBJECT)的库.

要在顶级CMakeLists.txt里增加BUILD_SHARED_LIBS.用option()命令来让用户可选的开或关.

下一步要重构MathFunctions,让它变成封装调用mysqrtsqrt真实的库,而非调用代码来实现逻辑的库.

也表明USE_MYMATH不再控制构建MathFunctions,而是控制的行为.

第一步是更新顶级CMakeLists.txt的第一节如下:

cmake_minimum_required(VERSION 3.10)
//设置项目名和版本
project(Tutorial VERSION 1.0)
//指定`C++`标准
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)//控制`静态库和共享库`的`构建位置`,这样在`Windows`上就不需要修改运行`可执行文件`的路径set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}")
option(BUILD_SHARED_LIBS "Build using shared libraries" ON)//配置头文件为仅传递版本号
configure_file(TutorialConfig.h.in TutorialConfig.h)
//添加`MathFunctions`库
add_subdirectory(MathFunctions)
//添加可执行文件
add_executable(Tutorial tutorial.cxx)
target_link_libraries(Tutorial PUBLIC MathFunctions)

既然总是使用MathFunctions.需要更新库的逻辑.因此在MathFunctions/CMakeLists.txt里需要创建一个SqrtLibrary.

该库会在启用USE_MYMATH构建并安装.现在,显式要求按静态库构建SqrtLibrary就可以了.

结果是MathFunctions/CMakeLists.txt应该如下:

//添加运行的库
add_library(MathFunctions MathFunctions.cxx)
//说明外部`链接`都要包含当前的`源目录`才能找到`MathFunctions.h`,而我们不必.
target_include_directories(MathFunctionsINTERFACE${CMAKE_CURRENT_SOURCE_DIR}
)
//应该用自己的数学函数吗
option(USE_MYMATH "用自己的" ON)
if(USE_MYMATH)target_compile_definitions(MathFunctions PRIVATE "USE_MYMATH")# 先加造表的exeadd_executable(MakeTable MakeTable.cxx)# 加命令来生成源码add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/Table.hCOMMAND MakeTable ${CMAKE_CURRENT_BINARY_DIR}/Table.hDEPENDS MakeTable)# 干活的库add_library(SqrtLibrary STATICmysqrt.cxx${CMAKE_CURRENT_BINARY_DIR}/Table.h)# 依赖`dir`来找Table.htarget_include_directories(SqrtLibraryPRIVATE${CMAKE_CURRENT_BINARY_DIR})target_link_libraries(MathFunctions PRIVATE SqrtLibrary)
endif()//定义符号,说明在`窗口`上,构建时要用`declspec(dllexport)`
target_compile_definitions(MathFunctions PRIVATE "EXPORTING_MYMATH")
//安装规则
set(installable_libs MathFunctions)
if(TARGET SqrtLibrary)list(APPEND installable_libs SqrtLibrary)
endif()
install(TARGETS ${installable_libs} DESTINATION lib)
install(FILES MathFunctions.h DESTINATION include)

下一步更新MathFunctions/mysqrt.cxx以使用mathfunctionsdetail名字空间:

#include <iostream>
#include "MathFunctions.h"
//包括生成的表
#include "Table.h"
namespace mathfunctions {
namespace detail {
//使用简单操作的`hack`平方根计算
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 << "Computing sqrt of " << x << " to be " << result << std::endl;}return result;
}
}
}

还要调整tutorial.cxx,不再使用USE_MYMATH:
1.总是包含MathFunctions.h
2.总是使用mathfunctions::sqrt
3.不包含cmath

最后更新MathFunctions/MathFunctions.h来用dll导出定义:

#if defined(_WIN32)
#  if defined(EXPORTING_MYMATH)
#    define DECLSPEC __declspec(dllexport)
#  else
#    define DECLSPEC __declspec(dllimport)
#  endif
#else // non windows
#  define DECLSPEC
#endifnamespace mathfunctions {double DECLSPEC sqrt(double x);
}

这时,如果再构建,会注意到链接失败,因为试图把包含非位置无关代码(PIC)静态库(指SqrtLibrary)和另一个包含(PIC)的库(指MathFunctions)组合在一起.

不管什么构建类型,要显式设置SqrtLibraryPOSITION_INDEPENDENT_CODE(PIC)目标属性为True.

  # 默认共享库时,SqrtLibrary需要PICset_target_properties(SqrtLibrary PROPERTIESPOSITION_INDEPENDENT_CODE${BUILD_SHARED_LIBS})target_link_libraries(MathFunctions PRIVATE SqrtLibrary)

练习:修改MathFunctions.h来使用dll导出定义.使用CMake文档,能否用辅助模块来简化?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/665816.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HiveSQL题——collect_set()/collect_list()聚合函数

一、collect_set() /collect_list()介绍 collect_set()函数与collect_list()函数属于高级聚合函数&#xff08;行转列&#xff09;&#xff0c;将分组中的某列转换成一个数组返回&#xff0c;常与concat_ws()函数连用实现字段拼接效果。 collect_list&#xff1a;收集并形成lis…

海量微服务关联关系挖掘与告警拓扑展示

一、前言 1、微服务关联复杂性 在当前云原生与DevOps、PaaS技术应用背景下&#xff0c;微服务化是一个显著的特征。所谓微服务&#xff0c;简单来说就是将过去的大型单体应用按照功能职能&#xff0c;划定交互边界&#xff0c;拆分为一个个小型的微服务汇总而成最终的产品交付…

QEMU源码全解析 —— 内存虚拟化(2)

接前一篇文章&#xff1a; 本文内容参考&#xff1a; 《趣谈Linux操作系统》 —— 刘超&#xff0c;极客时间 《QEMU/KVM》源码解析与应用 —— 李强&#xff0c;机械工业出版社 QEMU内存管理模型 特此致谢&#xff01; QEMU内存初始化 1. 基本结构 在开始介绍内存初始化…

H12-821_230

230.在VRP系统中&#xff0c;当在广播网络中的两台路由器互联接口的MTU不匹配&#xff0c;且接口配置了ospf mtu-enable时&#xff0c;则关于两台路由器邻居关系状态变化描述&#xff0c;正确的是以下哪一项? A.两台路由器的邻居关系可以进入Fu11状态 B.两台路由器的邻居关系状…

springboot153相亲网站

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

预充电阻原理作用,直流预充电电路设计指南

最初将电池连接到具有容性输入的负载时&#xff0c;当负载电容充电至电池电压时&#xff0c;会出现电流涌入。 对于大型电池&#xff08;具有低源电阻&#xff09;和强大的负载&#xff08;输入端具有大电容器&#xff09;&#xff0c;浪涌电流可以很容易地达到 1000 A 的峰值。…

Ps:自动对齐图层

Ps菜单&#xff1a;编辑/自动对齐图层 Edit/Auto-Align Layers 自动对齐图层 Auto-Align Layers命令通过分析选中图层上的图像&#xff0c;识别出图像间的共同特征点&#xff08;如边缘、纹理或特定标记等&#xff09;&#xff0c;然后基于这些特征点变换&#xff08;移动、旋转…

阻塞队列(超详细易懂)

目录 一、阻塞队列 1.阻塞队列概述 2.生产者消费者模型 3.阻塞队列的作用 4.标准库中的阻塞队列类 5.例子&#xff1a;简单生产者消费者模型 二、阻塞队列模拟实现 1.实现循环队列&#xff08;可跳过&#xff09; 1.1简述环形队列 1.2代码实现 2.实现阻塞队列 2.1实…

探索前端开发框架:React、Angular 和 Vue 的对决(一)

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

webpack配置

一、很多基础方面的配置被vuecli所集成一般项目都是使用vuecli,不会真正的去从0-1进行webpack配置: 1、vuecli中的webpack基础配置: (1)入口文件默认在src/main;输出在dist; (2)集成了大量的插件和加载器:babel-loader 处理 JavaScript 文件、使用 css-loader 和 style-load…

基于控制台的购书系统(Java 语言实现)

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》|《数据结构与算法》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ &#x1f64f;小杨水平有限&#xff0c;欢…

C++棋类小游戏2

今天给大家带来我花了1周时间自创的小游戏的升级版&#xff0c;博主还是一名小学生&#xff0c;希望大家提提意见。这是我写的最长的C代码&#xff0c;希望大家喜欢&#xff0c;不要抄袭&#xff0c;任何编译器都可以。 以前版本——C自创棋类小游戏-CSDN博客 C内容提示&…

苹果CMS挖片网升级版视频主题模版源码

自适应视频站正版高级挖片网收录模板&#xff0c;模板不错&#xff0c;是挖片网的升级版。 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/88799583 更多资源下载&#xff1a;关注我。

解决maven 在IDEA 下载依赖包速度慢的问题

1.idea界面双击shift键 2.打开setting.xml文件 复制粘贴 <?xml version"1.0" encoding"UTF-8"?> <settings xmlns"http://maven.apache.org/SETTINGS/1.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:sc…

深度学习实战 | 卷积神经网络LeNet手写数字识别(带手写板GUI界面)

引言 在深度学习领域&#xff0c;卷积神经网络&#xff08;Convolutional Neural Network, CNN&#xff09;是一种广泛应用于图像识别任务的神经网络结构。LeNet是一种经典的CNN结构&#xff0c;被广泛应用于基础的图像分类任务。本文将介绍如何使用LeNet卷积神经网络实现手写…

Transformer实战-系列教程4:Vision Transformer 源码解读2

&#x1f6a9;&#x1f6a9;&#x1f6a9;Transformer实战-系列教程总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 4、Embbeding类 self.embeddings Embeddings(config, img_sizeimg_size) class Embeddings(nn.…

(已解决)spingboot 后端发送QQ邮箱验证码

打开QQ邮箱pop3请求服务&#xff1a;&#xff08;按照QQ邮箱引导操作&#xff09; 导入依赖&#xff08;不是maven项目就自己添加jar包&#xff09;&#xff1a; <!-- 邮件发送--><dependency><groupId>org.springframework.boot</groupId><…

vite打包原理

vite 工程化开发&#xff1a;打包工具 启动速度很快 核心原理还是webpack 把webpack封装了&#xff0c;把webpack对象封装了 和vue2整体结构几乎一致 webpack两种模式&#xff1a;开发&生产 代码打包编译&#xff0c;本地起一个web服务器实时预览编译后的结果 build 命令模…

2024.2.3

单向循环链表的头插 头删 尾插和尾删 //头结点插入 Linklist insere_element(Linklist head,datatype element) {Linklist screat();s->dataelement;if(NULLhead){heads;}else{Linklist phead;while(p->next!head){pp->next;}s->nexthead;heads;p->nexthead;}r…

太强了,AI数字人从制作到变现一次搞定

AI数字人从制作到变现 如果说GPT类大模型是我们人类的第二大脑&#xff0c;数字人就是我们人类在互联网上的第二个身体。随着 AI 的迅速发展&#xff0c;2024 年 AI 模型开始从大型语言模型向大型视觉模型转变。数字人技术作为其分支之一&#xff0c;正日益成为科技、娱乐、教…