工欲善其事必先利其器--CMake牛刀小试

这里假设用户已经安装好MinGW编译套件!并配置好环境变量!具体怎么下载和配置网上教程非常多,这里贴上一个链接:不仅教你安装MinGW还教你安装VScode配置

1、学习c plus plus编码为什么要学习CMake?

在Windows下使用集成开发环境(IDE)开发项目时,一般会使用IDE自带的构建工具(如Visual Studio的MSBuild),而不是使用CMake,是不是使用Visual Studio很爽,一键构建,反正也不清楚那么多源文件先编译谁,后编译谁,反正一点击run就完事了!所以如果你想了解你生成的可执行程序(exe)是具体如何出现的,那么了解CMake可以帮助你更好地理解项目结构和构建过程。此外,如果你需要跨平台的项目,或需要在多个平台上构建同一个项目,使用CMake也是一个不错的选择。CMake中的C全称是Cross,表示跨平台!

2、CMake、MakeLists、MakeFile三者和用户之间的爱恨情仇

刚接触CMake时:啥玩意?我有Visual Studio,有QT,我用这玩意?搞这么复杂!abandon!

GitHub一搜代码,发现大佬很多都用CMake,迫不得已又开始接触CMake

项目要求c++代码跨平台,沃日,又得接触CMake!

CMake、MakeLists、MakeFile三者之间关系如下图所示。

(1)MakeLists是用户编写

(2)CMake不是用户编写,需要官网下载并配置环境变量:CMake 安装教程

(3)MakeFile不是用户编写,通过执行CMake命令自动生成

(4)Make不是用户编写,被包含在CMake里面了

综上所述,重点关注MakeLists如何编写,其他几个浅尝辄止!

CMake的牛刀小试图

3、Cmake小试牛刀

真学技术还是得官网!--> CMake tutorial

CMake tutorial手把手保姆式教学,12个用例随时学,用到哪个功能时再去学对应案例一点都不迟,不要陷入学习中!重点是了解CMake工作机制和流程!

4、练习Step1需要注意的点

严格按照步骤来,先准备好源文件

(1)编写CMakeLists.txt

下面是编写CMakeLists.txt的核心三部曲:

cmake_minimum_required(VERSION 3.25.1) // 1. 设定本工程需要的最低cmake版本!
project(Tutorial)                      // 2. 设定工程名字
add_executable(Tutorial tutorial.cxx)  // 3. 告诉cmake使用定义的源文件tutorial.cxx生成可执行文件Tutorial 

cmake_minimum_required(VERSION 3.25.1)命令这里存疑,cmake版本设置多少合适呢?不是很重要,暂不研究,只需要知道一旦设置了VERSION 3.25.1,那么camke版本必须大于等于3.25.1!

project(Tutorial)需要注意的是Tutorial是你的工程名字,作用是为了在后续的CMakeLists.txt文件中,我们可以使用该项目名称和支持的语言类型来进行其他设置。

注意project(Tutorial)中的Tutorial和add_executable(Tutorial tutorial.cxx)中的Tutorial 是一样的,但其实可以不一样,前者是工程名,后者是可运行文件名。根据用户命名习惯怎么设置都行!

(2)通过CMakeLists.txt生成MakeFile相关的一些列文件

为了防止生成的MakeFile文件跟源文件混合在一起导致混乱,新建Step1_build文件夹

在Step1_build文件夹中打开终端

执行如下指令

cmake -G "MinGW Makefiles" ../Step1

生成的中间文件如下

(3)通过MakeFile文件将源码翻译并链接生成可执行文件

通过如下命令

 mingw32-make

或者

cmake --build .

生成的可执行文件如下

至此,CMakeLists.txt-->MakeFile-->可执行文件告一段落!

本文转载于网络 如有侵权请联系删除

相关文章

  • CentOS 安装 node.js canvas

    环境:CentOS6.8_X64系统一、到官方下载最新的编译好的安装文件,目前是6.9.4。$>cd/usr/local/src#定位到这个目录,下载的文件会在这个目录 #使用wget下载(这个内置命令) $>wgethttps://nodejs.org/dist/v6.9.4/node-v6.9.4-linux-x64.tar.gz复制二、解压文件并移动位置$>cd /usr/local/src #定位到这个目录 $>tar xvf node-v6.9-linux-x64.tar.gz #解压刚才下载的文件到当前目录 $>mv node-v6.9.4-linux-x64 /usr/local/node  #移动刚才的解压的目的到上层目录,并重命名为node复制三、NODE环境配置如果想全局目录下都可以使用/usr/local/node,需要配置全局环境,步骤如下:vi /etc/profile #在最下面加入 #node config  export NODE_HOME=/usr/local/node export PATH=$PATH:$NODE_H

  • Context是怎么在Go语言中发挥关键作用的

    Context是Go语言独有的设计,在其他编程语言中很少见到类似的概念,用一句话解释Context在Go语言中的作用就是:Context为同一任务的多个goroutine之间提供了退出信号通知和元数据传递的功能。那么如果不用Context,就不能在Go语言里实现多个goroutine间的信号通知和元数据传递了吗?答案是:简单场景下可以,在多层级goroutine的控制中就行不通了。我们举一个例子来理解上面那段话假如主协程中有多个任务,主协程对这些任务有超时控制;而其中任务1又有多个子任务,任务1对这些子任务也有自己的超时控制,那么这些子任务既要感知主协程的取消信号,也需要感知任务1的取消信号。一个任务有多层goroutine任务的goroutine层级越深,想要自己做退出信号感知和元数据共享就越难。所以我们需要一种优雅的方案来实现这样一种机制:上层任务取消后,所有的下层任务都会被取消;中间某一层的任务取消后,只会将当前任务的下层任务取消,而不会影响上层的任务以及同级任务;可以线程安全地在goroutine之间共享元数据;为此Go官方在1.7版本就引入了Context来实现上面阐述的机制

  • Mac下更新brew及安装Prometheus+Grafana

    一背景近来在做容器研究,本地也打算做一次基于原生k8s的动态扩容。k8s提供了基于cpu和内存的扩容方案,但如果需要根据其他规则,例如接口访问次数等等,就需要其他的一些辅助工具,例如监控:prometheus。本篇先准备好相关环境,并了解Prometheus和Grafana的安装和基本配置使用方式。二brew重新安装尝试安装监控工具prometheus的时候,由于换了自己的旧电脑,发现brewinstall失败,报错信息如下:当然,已经尝试过了各种切换brew源,并试图更新,但发现网上搜到的都不好用,无法解决问题。所以干脆执行卸载,然后重新安装。结果发现,连一个可用的卸载脚本都不好找了。。例如这个:/usr/bin/ruby-e"$(curl-fsSLhttps://cdn.jsdelivr.net/gh/ineo6/homebrew-install/uninstall)"复制在本地执行的时候,就会给出提示,这已经是很旧的下载版本,目前已被废弃,新版脚本使用Bash重写。lijingyong:Downloadsflamingskys$/usr/bin/ruby-e&

  • CNCF宣布Open Policy Agent毕业

    云原生策略执行引擎被高盛、Netflix、Pinterest和T-Mobile等组织用于生产加州旧金山-2021年2月4日-为云原生软件构建可持续生态系统的CNCF®(云原生计算基金会)今天宣布开放政策代理(OpenPolicyAgent,OPA)毕业。OPA已经展示了广泛的采用、开放的治理过程、特性的成熟度以及对社区、可持续性和包容性的强烈承诺,达到毕业阶段[1]。 OPA[2]是一个开源的、通用的策略引擎,它支持跨整个堆栈执行统一的、上下文感知的策略。该项目于2018年4月进入CNCF沙箱,一年后进入孵化阶段。来自大约30个组织的90多名人员为OPA贡献力量,维护者来自四个组织,包括谷歌、微软、VMware和Styra。“随着云原生生态系统的增长,对组织来说,获得为现代云原生部署而构建的政策执行工具比以往任何时候都更重要,”云原生计算基金会CTOChrisAniszczyk说。“自从加入CNCF以来,OPA通过Gatekeeper项目与Kubernetes进行了更紧密的整合,同时也支持Kubernetes之外的各种用例。”该项目已被高盛、Netflix、Pinterest、T-Mo

  • 获取文件的大小(fseek和ftell函数)

    参考链接:C++ftell()//头文件#include<stdio.h>#include<stdlib.h>#include<string.h>//定义获取文件大小的函数intGet_File_Size(){  //打开一个文本文件  FILE*fp=fopen("C:\\Users\\Administrator\\Desktop\\hello.txt","r");  //判断是否打开成功  if(!fp)  {    //如果打开失败则返回fopen的错误内容    perror("fopenerror");    //结束函数    return-1;  }  //fseek函数fp指针到文件末尾,向前偏移0个字节  fseek(fp,0,SEEK_END);  //ftell返回文件的大小  intret=ftell(fp);  //打印文件的大小  printf("文件大小为:%d字节\n",ret);}//主函数intmain(){  //调用获取文件大小的函

  • Hue集成Hive

    上一篇博客为大家介绍了Hue集成HDFS,本篇我们继续,为大家带来Hue如何集成Hive!首先进入到Hue的conf目录下 /export/servers/hue-3.9.0-cdh5.14.0/desktop/conf修改Hue.ini根据下面的内容对文件中对应的属性进行修改![beeswax] hive_server_host=node1 hive_server_port=10000 hive_conf_dir=/export/servers/hive/conf server_conn_timeout=120 auth_username=root auth_password=123456 [metastore] #允许使用hive创建数据库表等操作 enable_new_create_table=true复制启动Hive服务、重启hue去node01机器上启动hive的metastore以及hiveserver2服务cd/export/servers/hive nohupbin/hive--servicemetastore& nohupbin/hive--serviceh

  • ES6语法中类(class)的实现原理

    JavaScript语言不同于其他的类C语言,没有提供类的概念,但是可以提供类似的语法糖来实现JS面向对象的编程范式,本质上不是严格意义上的类我们创建一个Person对象,包含两个属性name,age和一个普通的方法run()和静态方法say()。ES6classclassPerson{ constructor(name,age){ this.name=name; this.age=age; } staticrun(){ console.log("run") } say(){ console.log("hello!") } } Person.run();复制通过static关键字定义静态方法,静态方法只能通过类本身去调用,不能通过实例来调用。ES6构造函数varPerson=function(){ functionPerson(name,age){ this.name=name; this.age=age; } Person.run=functionrun(){ console.log("run"); }; va

  • 图解数据结构树之AVL树

    AVL树(平衡二叉树):AVL树本质上是一颗二叉查找树,但是它又具有以下特点:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。在AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为平衡二叉树。下面是平衡二叉树和非平衡二叉树对比的例图:平衡因子(bf):结点的左子树的深度减去右子树的深度,那么显然-1<=bf<=1;AVL树的作用:我们知道,对于一般的二叉搜索树(BinarySearchTree),其期望高度(即为一棵平衡树时)为log2n,其各操作的时间复杂度(O(log2n))同时也由此而决定。但是,在某些极端的情况下(如在插入的序列是有序的时),二叉搜索树将退化成近似链或链,此时,其操作的时间复杂度将退化成线性的,即O(n)。我们可以通过随机化建立二叉搜索树来尽量的避免这种情况,但是在进行了多次的操作之后,由于在删除时,我们总是选择将待删除节点的后继代替它本身,这样就会造成总是右边的节点数目减少,以至于树向左偏沉。这同时也会造成树的平衡性受到破坏,提高它的操作的时间复杂度。例如:我们按顺序将一组数据1,2,3,4,5

  • 【新手指南】App原型设计:如何快速实现这6种交互效果?

    做App原型设计,那么页面切换、进度条、页面滚动、图片轮播,下拉菜单,搜索框这些交互效果必不可少。如何简单快速地实现这些效果呢?以下小编根据经验为大家提供了一些简单的设计方法,以供参考。1.页面跳转作为一款App原型设计,页面跳转必不可少。如何快速实现页面间快速跳转的效果?小编最近在使用Mockplus制作原型设计,以下就以该工具为依托为大家介绍一种简单的设计方法。设计步骤Step1:点击触发页面跳转的组件。Step2:拖拽(点击后不放手)组件上的链接点,直至右侧项目树中某个页面上。Step3:交互已经设置完成,即可演示预览页面跳转效果。2.进度条做过App原型设计的设计师都知道,在适当的场景中使用进度条可以使产品更“人性化”,从而减少用户的不确定心理,愿意等待页面加载。但是对于设计师来说,如何利用原型设计工具来制作进度条?设计过程繁琐吗?以下有个设计方法供大家参考。设计步骤Step1:从左侧组件库拖出2个形状组件,1个按钮组件。Step2:调整两个形状组件为相同宽度的长方形,水平相连放置,并去掉组件接触面的边框线。Step3:将2个形状组件设置为不同的颜色。Step4:设置交互。a.

  • 如何在Debian 9上使用Python 3设置Jupyter笔记本

    不使用Debian9?选择其他版本:Ubuntu16.04介绍JupyterNotebook为交互式计算提供了一个命令shell作为Web应用程序。该工具可以与多种语言一起使用,包括Python,Julia,R,Haskell和Ruby。它通常用于处理数据,统计建模和机器学习。本教程将指导您设置JupyterNotebook以从Debian9服务器运行,并教您如何连接和使用笔记本。Jupyter笔记本(或简称笔记本)是由JupyterNotebook应用程序生成的文档,其中包含计算机代码和富文本元素(段落,方程式,图形,链接等),有助于呈现和共享可重复的研究。在本指南的最后,您将能够使用在远程服务器上运行的JupyterNotebook运行Python3代码。先决条件为了完成本指南,您应该拥有一个带有基本防火墙的新的Debian9服务器实例和一个配置了sudo权限的非root用户。您可以通过Debian9指南运行初始服务器设置来了解如何进行此设置。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器。第1步-安装Pip和Pyth

  • MyBatis学习总结(二)——MyBatis核心配置文件与输入输出映射

    在上一章中我们学习了《MyBatis学习总结(一)——ORM概要与MyBatis快速起步》,这一章主要是介绍MyBatis核心配置文件、使用接口+XML实现完整数据访问、输入参数映射与输出结果映射等内容。一、MyBatis配置文件概要MyBatis核心配置文件在初始化时会被引用,在配置文件中定义了一些参数,当然可以完全不需要配置文件,全部通过编码实现,该配置文件主要是是起到解偶的作用。如第一讲中我们用到conf.xml文件:<?xmlversion="1.0"encoding="UTF-8"?> <!DOCTYPEconfiguration PUBLIC"-//mybatis.org//DTDConfig3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <environmentsdefault="development"> <environm

  • 提高Mac下itunes的下载速度

    给老婆买了iPhone4s之后,开始在Mac上用iTunes下载软件,发现速度龟速,好歹家里也是10M光纤啊,这个小水管的下载速度绝对不能忍受,于是百度了一下,发现可能是域名解析造成的问题。苹果为AppStore准备了a1.phobos.apple.com到a2000.phobos.apple.com一群服务器,如果连接到比较慢的服务器上,那肯定是小水管了。解决方案就是探测一个最快的IP,然后在HOSTS文件中将所有的域名都指向这个IP。看网上的一些资料,都是使用一个Windows下的工具来探测,可是我这里是Mac没有Windows啊,想想这个问题不难,写了一个脚本来探测最快的IP。代码如下:1 #!/bin/sh  2   3 # Find the fastest apple store hosts  4   5 printf "%-20s\t%-16s\t%-10s\n" "Domain" "Ip" "Avg Ping"  6 #printf "Domain\tIp\tAvg Ping\n&q

  • 10个HR不可不知的职场最流行测评工具

    在工作中,许多HR们不免会需要用到众多的测评工具,帮助企业迅速筛选到合适的人才。同时很多时候HR自己进入职场也可能被这些大大小小的测评工具测过。作为一个HR,以下10个在职场流行的测评工具必然是需要知悉的:1.DISC4个字母分别代表4个类型:D:Dominance(支配性)、I:Influence(影响性)、S:Steadiness(稳定性)、C:Compliance(服从性)。它是一个性格测评,理论起源为马斯顿的“正常人的情绪”,由InscapePublishing拥有。应用:DISC,代表着一种可观察的人类行为与情绪,将会使你对自己和他人有更深入、具体、完整而客观的了解。目前在国内除了被广泛运用于组织人才测评,招聘、职位调整、领导力提升、建立培训需求,都可基于此开展工作。局限:DISC的结果描述具有时间上的稳定性,但是缺乏空间上(跨情境)的一致性,不同情境下可能导致与结果描述不一样的行为。2.Facet5意志力、控制、爱心、精力和情绪性这五个因素被广泛地认为是个性的基本砌块。世界上许多研究结果都一致表明,这五大因素是全面描述个性的五个原子因素。Facet5通过对这五个方面13个子

  • 王迁:电子游戏直播的著作权问题研究

    王迁 华东政法大学知识产权学院教授  摘 要:对电子游戏的直播涉及向公众传播游戏中的影视作品和音乐作品。判断未经许可的直播是否侵权,不应以是否影响电子竞技产业发展为依据,而取决于其是否构成合理使用。对游戏画面的直播通常不是为了单纯地再现画面本身的美感或所表达的思想感情,而是展示特定用户的游戏技巧和战果,因此具有转换性。同时游戏直播不会替代欣赏直播的用户对运行游戏的需要,对游戏市场的影响是有限的。因此对游戏画面的直播可以构成合理使用。  关键词:游戏直播;合理使用;转换性使用前言  对电子游戏进行直播(以下简称“游戏直播”),是指将游戏玩家操作各类电子游戏的过程通过电视或互联网等媒体向公众进行同步传播,使公众实时地了解该玩家运行游戏的过程,从而了解该玩家使用的游戏策略和在游戏中的进展。游戏直播满足了玩家展示其游戏技巧的心理需求,也能使他人从中学习游戏经验并获得“观战”的乐趣,因此风靡一时。  游戏直播的兴起还与电子竞技产业密切相关。许多游戏用户通过网络在同一游戏之中的相互竞赛达到了相当规模,吸引了商业机构组织并赞助这种电子竞技,以及电视和网络等媒体进行直播。2004年,中华全国体育总会主

  • zookeeper入门

    几个关键点: 最好集群部署,用于分布式协调 重要的概念:znode/session/watcher(类似订阅发布/观察者模式)/zab协议/读写模式 数据模型:类Linux形式的树形结构 zab协议: z-automatic-broadcast(原子广播)是zk的关键 zab协议 z-automatic-broadcast(原子广播)是zk的关键 原子广播分为两个步骤: 消息广播(同步) 崩溃恢复(选主) zab核心:定义了事务请求的处理方式 所有请求都由全局唯一的leader来处理 leader把一个客户端事务请求,转换成一个事务proposal,并将之分发给所有的follower(也就是广播的过程)。 leader分发后等待所有的follower的ACK反馈。超过半数后会再向所有的follower发commited消息,要求将上一个事务proposal提交。 总结:zab让leader都经历了三个阶段:发现(选举),同步,广播。 znode(zk的节点) zk的结构类似于Linux的树形目录结构,每个节点既是文件又是

  • vue--微信支付

    1、当前页面没有注册:   需要登录微信支付商家后台,添加支付路径授权 2、安装 weixin-js-sdk 微信SDK npminstallweixin-js-sdk--save   3、引入 importwxfrom'weixin-js-sdk'; 4、在 created()中执行一个函数获取APPID等参数进行微信授权 fetchGetsignpackageAction(){ letparam={}; param.url=window.location.href; fetchGetsignpackage(param).then((res)=>{ letresData=res.data; if(resData.respHeader.resultCode===0){ constData=resData.respBody; wx.config({ debug:false, appId:Data.appId, timestamp:Data.timestamp, nonceStr:Data.nonceStr, signature:Data.s

  • 【hihocoder1251】Today is a rainy day

    #include<bits/stdc++.h> constintN=120; constintM=5e4+5; constintinf=0x3f3f3f3f; usingnamespacestd; chars1[N],s2[N]; intc[6],f[6][6],dis[M]; inlineintIndex(int*a){ intans=0; for(inti=0;i<6;i++)ans=ans*6+a[i]; returnans; } inlinevoidhs(intx,int*a){ for(inti=5;i>=0;i--)a[i]=x%6,x/=6; } inlinevoidbfs(){ memset(dis,127,sizeof(dis));intb[6]; for(inti=0;i<6;i++)b[i]=i; intx=Index(b);dis[x]=0; staticqueue<int>q;q.push(x); while(!q.empty()){ intu=q.front();q.pop(); hs(u,b); for(inti=

  • JSTL常用代码总结

    1.jstl判空:   (1)须先引人<%@tagliburi="http://java.sun.com/jsp/jstl/functions"prefix="fn"%>   (2)   <c:iftest="${basisList!=null&&fn:length(basisList)>0}">      </c:if>   2.声明变量:   声明变量place=0   <c:setvar="place"value="0"/>     改变变量place=1   <c:setvar="place"value="1"/>     判断声明的变量place是否等于0   <c:iftest="${place==0}">暂无地方条款</c:if

  • 轻松实现图片高清美颜优化的两种方法

    目前90%以上看起来清楚的图片仍然存在视觉缺陷,比如噪音、边缘、色温、灯光、饱和度、焦距等或多或少存在误差,时常影响视力健康,很容易造成视觉疲劳、近视、花眼等疾病。我们为此准备了两种高清修复模型A&B,以下简称A和B。两种模型均可以修复图片使之更加清晰、更加适合人类视觉,看起来更加舒适。实现步骤:进入"图龙解"首页,选择视觉增强“高清修复A”或“高清修复B”上传你的图片即可。我们在以下例子中进一步说明。 例一:老旧照片翻新效果比较,A的色调更加柔和,贴近老照片的风格;B更强调细节表现细腻,贴近原始照片风格;A和B均达到了高清效果,对比原图看起来更舒适。 例二:这是一组彩色图片,对比原图,B突出了细节纹理、人物得到美化美颜;与B稍有不同,A虚化了背景,突出人物给出了单反效果,色温更柔和,人物也有美颜效果。 例三:对比原图,A&B细化了图片纹理、边缘处理明显,A的色调看起来更加柔和,贴近自然。   例四:对比原图,B已然突出纹理细节,提高了清晰度,但色温基本没变;A不仅纹理细节获得提升,提高了清晰度,更给出了一种复古效果,根据原图特征色温发生自然变化,显得更

  • Oracle 11g EM安全证书问题无法访问的解决办法

    OS:WindowsServer2012 Oracle:11gR2 上一篇 Oracle11gEM删除重建的方法 通过命令的方式重建了EM,启动也成功 emctlstatusdbconsole复制使用以上命令查看EM的状态也是正常的,但是还是无法访问,有些小奇怪 IE访问的结果 访问https的地址,明显少了一个继续浏览此网站(不推荐)的提示,增加了可信站点,也没有什么效果 使用360极速浏览器(Chromium内核)访问结果如下: 也是无法访问,但是多了点儿提示信息错误码:ssl_error_weak_server_cert_key但也还是看不太明白 网上搜罗了下 http://blog.csdn.net/chenxianping/article/details/43749333 有说使用Firefox就能访问到的,但是安装最新版的Firefox依然无法访问 …… 但是最后还是搜到一篇帖子提供了解决的办法 Oracle11gem启动报此网站的安全证书有问题的解决方案 具体解决办法如下: PSC:\Users\Admini

  • 买家一个单下了两件,我想发两个包裹怎么办

    我家的宝贝比较重,两件就会超重了,快递的续重费算下来比发两个快递单还贵,可以用拼多多的小智打单打印两个快递单出来吗? 小智打单是支持拆单打印的,而且提供了多种方式应对多种场景。 场景1打印前就知道要发多个包裹 如果打印前就知道要发多个包裹的话,可以点击打多单的按钮 点击打多单之后,会弹出具体拆单的方式: 按订单商品件数拆分:每个订单中有多少件商品,就会拆成多少个快递单,比如选择了10个订单,其中一个订单有2件商品,其余订单每个只有1件;那么2件商品那个单,会打出2个快递单,其余订单都只打印1个快递单。 按订单商品SKU拆分:这种一般用在自动合单里,如果一个买家同时买了店铺的多个宝贝或多款sku,小智打单默认会帮您合成一单,但如果您想按不同sku发多个快递单,那么可以使用这个选项 固定件数拆分:和订单中的商品无关,这里填写几份,每行记录会打印出几个快递单 场景2打印后才发现,要补打一张 还有一种情况,就是打印时没注意是多件的,打完之后才发现,需要补打一张。 如果此时订单还没发货,可以在待发货列表中选中那个订单,点击按钮“打印快递单”,系统会提示您这个订单已经打过快递单了,

相关推荐

推荐阅读