Windows10下源码编译MXNet C++ api with OpenBlas_编译mxnet时需要安装openblas-程序员宅基地

技术标签: MXNet  mxnet  

为什么要编译等这种介绍性的文字就不多说了。直入主题:Windows下源码编译mxnet

MXNet的依赖相对而言是比较少的了,但编译起来也不简单。

你可以按照官方的文档来编译,按道理来讲,结果都是一样的,我习惯用cmake-gui,主要是配置参数时很直观。想单刀直入开始编译的话,我建议你先看最后的总结。下面的过程和错误分析因为是边编译边分析,所以顺序上不一定是最佳的。

官网的资料很多,各个地方描述也不一致,我大致总结一下,

关于官网上资料的总结说明

首先,如果版本是1.5.1或以下,先修改tuple.h中的_MSC_VER,具体原因与如何修改请参考《通过OpWrapperGenerator.py生成OP.h时的问题》这一小节。不要编译完了再来改,那得重新开始编译一次。

(1)由于MXNet有众多的依赖,所以如果使用git clone,一定要加上--recursive指令,这样3rdparty文件夹下的各个依赖模块会自动下载。因为我使用的文件包,所以就不用这个git clone了。

(2)这里专门说明,最新版的MXNet支持MSVC2019。参考:https://mxnet.cdn.apache.org/get_started/build_from_source

(3)在不使用git clone的情况下,编译哪个文件包,官方文档中已经明确指明。在不使用git clone --recursive的情况下,是这个链接 https://mxnet.cdn.apache.org/get_started/download 下的.tar.gz包(the Download page and download the .tar.gz),对应到 https://github.com/apache/incubator-mxnet/releases ,以1.60版为例 ,有以下5个文件包,需要下载的就是下面的第一个包

Assets5

apache-mxnet-src-1.6.0-incubating.tar.gz34.3 MB

apache-mxnet-src-1.6.0-incubating.tar.gz.asc833 Bytes

apache-mxnet-src-1.6.0-incubating.tar.gz.sha512171 Bytes

Source code(zip)

Source code(tar.gz)

目前最新版是1.70rc0,全部下载资源如下,编译同样选择第一个包。

Assets5

apache-mxnet-src-1.7.0.rc0-incubating.tar.gz35.4 MB

apache-mxnet-src-1.7.0.rc0-incubating.tar.gz.asc836 Bytes

apache-mxnet-src-1.7.0.rc0-incubating.tar.gz.sha512175 Bytes

Source code(zip)

Source code(tar.gz)

还有1.5.1(1.5的改进版)这个版本,是经常使用的,相关资料也比较多,要源码编译的话,同样选第一个包,

Assets5

apache-mxnet-src-1.5.1-incubating.tar.gz159 MB

apache-mxnet-src-1.5.1-incubating.tar.gz.asc836 Bytes

apache-mxnet-src-1.5.1-incubating.tar.gz.sha512171 Bytes

Source code(zip)

Source code(tar.gz)

(4)配置哪些选项

根据https://github.com/dmlc/gluon-cv/tree/master/scripts/deployment/cpp-inference中的说明文档,默认的选择项前面已经有一大堆选择,逐个按需要配置,比如

-DUSE_CUDA=0 -DUSE_CUDNN=0 -DUSE_OPENCV=1 -DUSE_OPENMP=1 -DUSE_PROFILER=1 -DUSE_BLAS=open -DUSE_LAPACK=1 -DUSE_DIST_KVSTORE=0 -DUSE_MKL_IF_AVAILABLE=0 -DUSE_CPP_PACKAGE=1 -DBUILD_CPP_EXAMPLES=0 -DDO_NOT_BUILD_EXAMPLES=1 -DCMAKE_INSTALL_PREFIX=c:\incubator-mxnet

去掉USE_F16C,否则报错:F16C instruction set is not yet supported for MSVC;

去掉USE_JEMALLOC (to avoid incompatibilities with LLVM’s OpenMP library);

去掉MKL所有相关的选项(假设你是要编译OpenBlas支持的项目);

CUDA什么的根据自己的实际情况选。

(5) 关于OpenCV

添加OpenCV目录,这个不多说了,我的OpenCV都是自己编译的,

https://blog.csdn.net/tanmx219/article/details/106928732

你可以直接下载官方的版本再配置,比如使用这个地方的openCV包:

https://github.com/opencv/opencv/releases/tag/4.3.0

配置目录下面有那个OpenCVConfig.cmake文件即可。

(6)OpenBlas的配置

OpenBlas要输入2个地址,一个是lib(注意不是lib directory),一个是include directory,以我自己下载的windows版为例,是这两个地址:
D:\devMXNet\OpenBLAS-0.3.10-x64\lib\libopenblas.dll.a
D:\devMXNet\OpenBLAS-0.3.10-x64\include

上面这个libopenblas.dll.a,我用libopenblas.lib发现也可以正确完成编译,不知道为什么,我又查了网上不少贴子,大家用的都是libopenblas.dll.a。

另外,我在环境变量中设置:OpenBLAS_HOME=D:\devMXNet\openblas-0.2.14-x64-install,此时在CMakeCache.txt中自动给出的地址是:
//Path to a file.
OpenBLAS_INCLUDE_DIR:PATH=D:/devMXNet/openblas-0.2.14-x64-install/include
//Path to a library.
OpenBLAS_LIB:FILEPATH=D:/devMXNet/openblas-0.2.14-x64-install/lib/libopenblas.dll.a
可见,cmake中的默认配置也是libopenblas.dll.a。

附: openblas-0.2.14-x64-install是按照这里
https://github.com/dmlc/gluon-cv/tree/master/scripts/deployment/cpp-inference
 提供的下载地址
http://mxnet-files.s3.amazonaws.com/openblas/openblas-0.2.14-x64-install.zip)

最后, 上图

反复configure几次后,会出现一些警告,貌似是gtest版本什么的,貌似没有什么影响,不管,直接Generate生成项目,开始启动vs2019编译即可,

 

选择Release模式,编译出奇地慢,1个多小时吧,耐心等待吧!能计划到休息时再编译就完美了。

正常情况下,最后会生成libmxnet.dll。偶尔会有找不到op.h这样的报错,貌似这些主要是给例子用的,对libmxnet.dll没有影响。

 

处理 无法打开包括文件: “mxnet-cpp/op.h”: No such file or directory

这里特别列出来,是因为大多数在Windows系统中使用cmake-gui的朋友都会碰到,但没有一个给出了合理的解决方案,如果直接使用Makefile,貌似没有这个问题(我没试过)。后来我参考了这里(https://www.programmersought.com/article/14353977045/)的说明,大概知道了原因。现在把解决方案分享出来。

报错

报错内容大致如下

........ 严重性 代码 说明 项目 文件 行 禁止显示状态 错误 C1083 无法打开包括文件: “mxnet-cpp/op.h”: No such file or directory mlp D:\devMXNet\apache-mxnet-160\cpp-package\include\mxnet-cpp\optimizer.hpp 37

错误 C1083 无法打开包括文件: “mxnet-cpp/op.h”: No such file or directory mlp_gpu D:\devMXNet\apache-mxnet-160\cpp-package\include\mxnet-cpp\optimizer.hpp 37

错误 C1083 无法打开包括文件: “mxnet-cpp/op.h”: No such file or directory mlp_cpu D:\devMXNet\apache-mxnet-160\cpp-package\include\mxnet-cpp\optimizer.hpp 37

错误 C1083 无法打开包括文件: “mxnet-cpp/op.h”: No such file or directory resnet D:\devMXNet\apache-mxnet-160\cpp-package\include\mxnet-cpp\optimizer.hpp 37

错误 C1083 无法打开包括文件: “mxnet-cpp/op.h”: No such file or directory alexnet D:\devMXNet\apache-mxnet-160\cpp-package\include\mxnet-cpp\optimizer.hpp 37

错误 C1083 无法打开包括文件: “mxnet-cpp/op.h”: No such file or directory googlenet D:\devMXNet\apache-mxnet-160\cpp-package\include\mxnet-cpp\optimizer.hpp 37

错误 C1083 无法打开包括文件: “mxnet-cpp/op.h”: No such file or directory charRNN D:\devMXNet\apache-mxnet-160\cpp-package\include\mxnet-cpp\optimizer.hpp 37

错误 C1083 无法打开包括文件: “mxnet-cpp/op.h”: No such file or directory inception_bn D:\devMXNet\apache-mxnet-160\cpp-package\include\mxnet-cpp\optimizer.hpp 37

错误 C1083 无法打开包括文件: “mxnet-cpp/op.h”: No such file or directory lenet D:\devMXNet\apache-mxnet-160\cpp-package\include\mxnet-cpp\optimizer.hpp 37

错误 C1083 无法打开包括文件: “mxnet-cpp/op.h”: No such file or directory lenet_with_mxdataiter D:\devMXNet\apache-mxnet-160\cpp-package\include\mxnet-cpp\optimizer.hpp 37

 

解决办法

切换到你的安装有mxnet(python api)的python环境,并且到这个地址下面(根据自己的编译目录选),

D:\devMXNet\apache-mxnet-151\cpp-package\script

使用下面的命令

python OpWrapperGenerator.py libmxnet.dll

如果你喜欢指定绝对地址的话,就是

python OpWrapperGenerator.py D:\\devMXNet\\apache-mxnet-151\\cpp-package\\scripts\\libmxnet.dll

如果一切正常的话,在这个相应的位置你就能找到这个op.h文件,

D:\devMXNet\apache-mxnet-151\cpp-package\include\mxnet-cpp\op.h

 

如果依赖文件不全,可能会出现下面的问题

如果OpWrapperGenerator.py在scripts下只能找到libmxnet.dll的话,大概率会得到下面的报错

Traceback (most recent call last):
  File "D:\Anaconda3\envs\mx36gpu\lib\runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "D:\Anaconda3\envs\mx36gpu\lib\runpy.py", line 85, in _run_code
    exec(code, run_globals)
  ......
  File "d:\devMXNet\apache-mxnet-151\cpp-package\scripts\OpWrapperGenerator.py", line 320, in ParseAllOps
    cdll.libmxnet = cdll.LoadLibrary(sys.argv[1])
  File "D:\Anaconda3\envs\mx36gpu\lib\ctypes\__init__.py", line 426, in LoadLibrary
    return self._dlltype(name)
  File "D:\Anaconda3\envs\mx36gpu\lib\ctypes\__init__.py", line 348, in __init__
    self._handle = _dlopen(self._name, mode)
OSError: [WinError 126] 找不到指定的模块。

这是因为libmxnet.dll的依赖模块找不到,有两种办法可以解决这个问题。

其一是在Path中加入这些模块的地址(有点麻烦)。

其二,把所有要用的模块统统拷贝到scripts这个目录下面,和OpWrapperGenerator.py放到一起,我就是这么干的。如下图,

 

当然这里有些是多余的,但这么一路搞过来,我实在有点累了,懒得一个个挑选。如果你想详细知道libmxnet.dll有哪些依赖,可以去这里

https://github.com/lucasg/Dependencies/releases

下载一个Windows下的依赖关系分析器Dependencies,根据里面提到的依赖一个一个地添加,我截个图吧(唉,好麻烦啊)

生的op.h我放到这里了(还没测试,不一定能用,就是看长什么样子而已,唉,真是一堆Op)

https://download.csdn.net/download/tanmx219/12594399

通过OpWrapperGenerator.py生成OP.h时的问题

在用python生成op.h文件时,你可能会碰到这样的问题

argument "lrs" of operator "multi_sgd_update" has unknown type ", required"
argument "wds" of operator "multi_sgd_update" has unknown type ", required"
argument "lrs" of operator "multi_sgd_mom_update" has unknown type ", required"
argument "lrs" of operator "multi_sgd_mom_update" has unknown type ", required"
argument "wds" of operator "multi_sgd_mom_update" has unknown type ", required"
argument "lrs" of operator "multi_mp_sgd_update" has unknown type ", required"
argument "wds" of operator "multi_mp_sgd_update" has unknown type ", required"
argument "lrs" of operator "multi_mp_sgd_mom_update" has unknown type ", required"
argument "wds" of operator "multi_mp_sgd_mom_update" has unknown type ", required"

解决办法如下。

找到这个文件,https://github.com/apache/incubator-mxnet/blob/master/include/mxnet/tuple.h#L744

把里面的#if这个块注释掉。

namespace dmlc {
/*! \brief description for optional TShape */
DMLC_DECLARE_TYPE_NAME(optional<mxnet::TShape>, "Shape or None");
DMLC_DECLARE_TYPE_NAME(optional<mxnet::Tuple<int>>, "Shape or None");
// avoid low version of MSVC
#if !defined(_MSC_VER) // <----------- Here !
template<typename T>
struct type_name_helper<mxnet::Tuple<T> > {
  static inline std::string value() {
    return "tuple of <" + type_name<T>() + ">";
  }
};
#endif
}  // namespace dmlc

解决方案在这里

https://github.com/apache/incubator-mxnet/issues/14116

https://github.com/apache/incubator-mxnet/issues/15143

https://github.com/apache/incubator-mxnet/pull/15144

我查看了1.60版的,这个地方已经改成下面的样子了(添加了&& _MSC_VER < 1900),

namespace dmlc {
/*! \brief description for optional TShape */
DMLC_DECLARE_TYPE_NAME(optional<mxnet::TShape>, "Shape or None");
DMLC_DECLARE_TYPE_NAME(optional<mxnet::Tuple<int>>, "Shape or None");
// avoid low version of MSVC
#if !(defined(_MSC_VER) && _MSC_VER < 1900)
template<typename T>
struct type_name_helper<mxnet::Tuple<T> > {
  static inline std::string value() {
    return "tuple of <" + type_name<T>() + ">";
  }
};
#endif
}  // namespace dmlc

另外,附上OSError: [WinError 126] 找不到指定的模块 —— 解决办法

Python程序在使用ctypes库调用C++程序创建的dll时,会产生如下错误:

OSError: [WinError 126] 找不到指定的模块

经百度后发现,引起此类问题的主要原因有二:

(1)找不到该DLL文件,路径不对或者被杀毒软件隔离;

(2)DLL动态库依赖于其他其他DLL动态库无法被系统找到。如果依赖库依赖其他库,一层一层地,都要找到,也就是说,在Python里面载入dll时,如果这个dll还依赖于其它的dll的话,这些相关的dll也得要能被Python的进程访问到(感觉好啰嗦)。

解决方法:

对于原因一,可以把文件路径改为绝对路径;把杀毒软件关闭重新操作。

对于原因二,最基本的解决方式是把相关的DLL 动态库也导进来。如果无法确定相关DLL 动态库,引起这类问题的原因很可能是由于你的目标主机没有安装相关的C++环境,去弄个Visual C++ Redistributable运行库吧!

 

错误 LNK1181 无法打开输入文件“mxnet_static.lib”

假设你已经编译好了各个部分,Op.h也已经正常生成,在最后生成关头,你会看到这样一个报错,

严重性 代码 说明 项目 文件 行 禁止显示状态
错误 LNK1181 无法打开输入文件“mxnet_static.lib” resnet D:\devMXNet\apache-mxnet-151\dev\cpp-package\example\LINK 1
错误 LNK1181 无法打开输入文件“mxnet_static.lib” mlp D:\devMXNet\apache-mxnet-151\dev\cpp-package\example\LINK 1
错误 LNK1181 无法打开输入文件“mxnet_static.lib” alexnet D:\devMXNet\apache-mxnet-151\dev\cpp-package\example\LINK 1
错误 LNK1181 无法打开输入文件“mxnet_static.lib” googlenet D:\devMXNet\apache-mxnet-151\dev\cpp-package\example\LINK 1
错误 LNK1181 无法打开输入文件“mxnet_static.lib” charRNN D:\devMXNet\apache-mxnet-151\dev\cpp-package\example\LINK 1
错误 LNK1181 无法打开输入文件“mxnet_static.lib” lenet_with_mxdataiter D:\devMXNet\apache-mxnet-151\dev\cpp-package\example\LINK 1
错误 LNK1181 无法打开输入文件“mxnet_static.lib” inception_bn D:\devMXNet\apache-mxnet-151\dev\cpp-package\example\LINK 1
错误 LNK1181 无法打开输入文件“mxnet_static.lib” lenet D:\devMXNet\apache-mxnet-151\dev\cpp-package\example\LINK 1
错误 LNK1181 无法打开输入文件“mxnet_static.lib” test_regress_label D:\devMXNet\apache-mxnet-151\dev\cpp-package\example\LINK 1
误 LNK1181 无法打开输入文件“mxnet_static.lib” mlp_gpu D:\devMXNet\apache-mxnet-151\dev\cpp-package\example\LINK 1

这是一个mxnet的cmake配置在windows下的BUG,可以参考: https://github.com/apache/incubator-mxnet/issues/11628

解决办法:

直接把文件
D:\devMXNet\apache-mxnet-151\dev\Release\libmxnet.lib
拷贝到
D:\devMXNet\apache-mxnet-151\dev\cpp-package\example\mxnet_static.lib
注意文件名已经改成了mxnet_static.lib

当然,不嫌麻烦你可以到cmake的配置文件里去改。
最后点击VS2019生成,恭喜,一切如意结束,生成完整的libmxnet.dll及相关例程。

 

最后的总结

前面写了这么多,因为和解决问题混在一起,所以看起来有些乱,我用自己第一次成功编译的案例理一下顺序。

(1)主要文件包: openblas-0.2.14-x64-install.zip (下载:http://mxnet-files.s3.amazonaws.com/openblas/openblas-0.2.14-x64-install.zip) apache-mxnet-src-1.5.1-incubating.tar.gz (下载:https://github.com/apache/incubator-mxnet/release

(2)修改tuple.h,把那句 #if... 改成这样   #if !(defined(_MSC_VER) && _MSC_VER < 1900)

(3)cmake-gui配置,不要忘记USE_CPP_PACKAGE等

(4)vs2019生成项目,最后例程会全面报错,C1083 无法打开包括文件: “mxnet-cpp/op.h”: No such file or directory

(5)生成op.h文件,例如我的anaconda mxnet环境是mx36gpu,那么就切换到这个环境中运行OpWrapperGenerator.py,不要忘记事先拷贝那些libmxnet.dll相关的其他dll文件。

(mx36gpu) C:\Users\Administrator>cd /d D:\devMXNet\apache-mxnet-151b\cpp-package\scripts
(mx36gpu) D:\devMXNet\apache-mxnet-151b\cpp-package\scripts>python OpWrapperGenerator.py libmxnet.dll
(mx36gpu) D:\devMXNet\apache-mxnet-151b\cpp-package\scripts>

(6)VS2019再次点击生成,此时会出现最后一个报错,错误 LNK1181 无法打开输入文件“mxnet_static.lib”,把libmxnet.lib拷贝过去并改名。

最后,上图,祝大家编译顺利。

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/tanmx219/article/details/107227439

智能推荐

稀疏编码的数学基础与理论分析-程序员宅基地

文章浏览阅读290次,点赞8次,收藏10次。1.背景介绍稀疏编码是一种用于处理稀疏数据的编码技术,其主要应用于信息传输、存储和处理等领域。稀疏数据是指数据中大部分元素为零或近似于零的数据,例如文本、图像、音频、视频等。稀疏编码的核心思想是将稀疏数据表示为非零元素和它们对应的位置信息,从而减少存储空间和计算复杂度。稀疏编码的研究起源于1990年代,随着大数据时代的到来,稀疏编码技术的应用范围和影响力不断扩大。目前,稀疏编码已经成为计算...

EasyGBS国标流媒体服务器GB28181国标方案安装使用文档-程序员宅基地

文章浏览阅读217次。EasyGBS - GB28181 国标方案安装使用文档下载安装包下载,正式使用需商业授权, 功能一致在线演示在线API架构图EasySIPCMSSIP 中心信令服务, 单节点, 自带一个 Redis Server, 随 EasySIPCMS 自启动, 不需要手动运行EasySIPSMSSIP 流媒体服务, 根..._easygbs-windows-2.6.0-23042316使用文档

【Web】记录巅峰极客2023 BabyURL题目复现——Jackson原生链_原生jackson 反序列化链子-程序员宅基地

文章浏览阅读1.2k次,点赞27次,收藏7次。2023巅峰极客 BabyURL之前AliyunCTF Bypassit I这题考查了这样一条链子:其实就是Jackson的原生反序列化利用今天复现的这题也是大同小异,一起来整一下。_原生jackson 反序列化链子

一文搞懂SpringCloud,详解干货,做好笔记_spring cloud-程序员宅基地

文章浏览阅读734次,点赞9次,收藏7次。微服务架构简单的说就是将单体应用进一步拆分,拆分成更小的服务,每个服务都是一个可以独立运行的项目。这么多小服务,如何管理他们?(服务治理 注册中心[服务注册 发现 剔除])这么多小服务,他们之间如何通讯?这么多小服务,客户端怎么访问他们?(网关)这么多小服务,一旦出现问题了,应该如何自处理?(容错)这么多小服务,一旦出现问题了,应该如何排错?(链路追踪)对于上面的问题,是任何一个微服务设计者都不能绕过去的,因此大部分的微服务产品都针对每一个问题提供了相应的组件来解决它们。_spring cloud

Js实现图片点击切换与轮播-程序员宅基地

文章浏览阅读5.9k次,点赞6次,收藏20次。Js实现图片点击切换与轮播图片点击切换<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title></title> <script type="text/ja..._点击图片进行轮播图切换

tensorflow-gpu版本安装教程(过程详细)_tensorflow gpu版本安装-程序员宅基地

文章浏览阅读10w+次,点赞245次,收藏1.5k次。在开始安装前,如果你的电脑装过tensorflow,请先把他们卸载干净,包括依赖的包(tensorflow-estimator、tensorboard、tensorflow、keras-applications、keras-preprocessing),不然后续安装了tensorflow-gpu可能会出现找不到cuda的问题。cuda、cudnn。..._tensorflow gpu版本安装

随便推点

物联网时代 权限滥用漏洞的攻击及防御-程序员宅基地

文章浏览阅读243次。0x00 简介权限滥用漏洞一般归类于逻辑问题,是指服务端功能开放过多或权限限制不严格,导致攻击者可以通过直接或间接调用的方式达到攻击效果。随着物联网时代的到来,这种漏洞已经屡见不鲜,各种漏洞组合利用也是千奇百怪、五花八门,这里总结漏洞是为了更好地应对和预防,如有不妥之处还请业内人士多多指教。0x01 背景2014年4月,在比特币飞涨的时代某网站曾经..._使用物联网漏洞的使用者

Visual Odometry and Depth Calculation--Epipolar Geometry--Direct Method--PnP_normalized plane coordinates-程序员宅基地

文章浏览阅读786次。A. Epipolar geometry and triangulationThe epipolar geometry mainly adopts the feature point method, such as SIFT, SURF and ORB, etc. to obtain the feature points corresponding to two frames of images. As shown in Figure 1, let the first image be ​ and th_normalized plane coordinates

开放信息抽取(OIE)系统(三)-- 第二代开放信息抽取系统(人工规则, rule-based, 先抽取关系)_语义角色增强的关系抽取-程序员宅基地

文章浏览阅读708次,点赞2次,收藏3次。开放信息抽取(OIE)系统(三)-- 第二代开放信息抽取系统(人工规则, rule-based, 先关系再实体)一.第二代开放信息抽取系统背景​ 第一代开放信息抽取系统(Open Information Extraction, OIE, learning-based, 自学习, 先抽取实体)通常抽取大量冗余信息,为了消除这些冗余信息,诞生了第二代开放信息抽取系统。二.第二代开放信息抽取系统历史第二代开放信息抽取系统着眼于解决第一代系统的三大问题: 大量非信息性提取(即省略关键信息的提取)、_语义角色增强的关系抽取

10个顶尖响应式HTML5网页_html欢迎页面-程序员宅基地

文章浏览阅读1.1w次,点赞6次,收藏51次。快速完成网页设计,10个顶尖响应式HTML5网页模板助你一臂之力为了寻找一个优质的网页模板,网页设计师和开发者往往可能会花上大半天的时间。不过幸运的是,现在的网页设计师和开发人员已经开始共享HTML5,Bootstrap和CSS3中的免费网页模板资源。鉴于网站模板的灵活性和强大的功能,现在广大设计师和开发者对html5网站的实际需求日益增长。为了造福大众,Mockplus的小伙伴整理了2018年最..._html欢迎页面

计算机二级 考试科目,2018全国计算机等级考试调整,一、二级都增加了考试科目...-程序员宅基地

文章浏览阅读282次。原标题:2018全国计算机等级考试调整,一、二级都增加了考试科目全国计算机等级考试将于9月15-17日举行。在备考的最后冲刺阶段,小编为大家整理了今年新公布的全国计算机等级考试调整方案,希望对备考的小伙伴有所帮助,快随小编往下看吧!从2018年3月开始,全国计算机等级考试实施2018版考试大纲,并按新体系开考各个考试级别。具体调整内容如下:一、考试级别及科目1.一级新增“网络安全素质教育”科目(代..._计算机二级增报科目什么意思

conan简单使用_apt install conan-程序员宅基地

文章浏览阅读240次。conan简单使用。_apt install conan