Mxnet在Windows10, vs2015平台的编译及开发-CPU版本

环境:

  • 基础配置:Windows10,cmake3.11.1,vs2015,QT5.11.1
  • mxnet配置:OpenBLAS-v0.2.9-Win64-int32,opencv3.4.1

相关资源百度云链接:https://pan.baidu.com/s/1pkPzm9vVRkHRc6KOkiyX9g 密码:2848

编译成功的项目百度云链接(在基础配置相同的情况下可以直接使用
):https://pan.baidu.com/s/1By5PeiORcvRFSysBGF5UOQ 密码:m87s


Mxnet在Windows10,vs2015平台的编译调试

通过实验证明Mxnet对Windows平台C++ 版本还是很不友好的,官网只给出了vs2015下的编译教程,网上有vs2013版的教程,但是因为mxnet有许多c++ 11的新特性,需要下载专门的CTP文件强化支持,同理vs2012也需要相应支持。但尽管如此,vs2013与vs2012下的编译均未成功,只成功在vs2015环境下搭建了cpu版本。

最好的教程必然是参考官网教程:
http://mxnet.incubator.apache.org/install/build_from_source.html#build-the-c-package

1. cmake:

首先github下载源码

git clone --recursive https://github.com/dmlc/mxnet 

注意一定不要忘记–recursive参数,因为mxnet依赖于DMLC通用工具包,–recursive参数可以自动加载mshadow等依赖。下载好OpenBLAS和opencv,按官网教程设置好环境变量,然后进行cmake,配置如下:
这里写图片描述
只需勾选以下两个:
这里写图片描述
cmake成功界面:
这里写图片描述
这里写图片描述

关于gpu版本:搭好cuda和cudnn,配置好相应的环境变量(可参考网上教程如 https://blog.csdn.net/m0_37638031/article/details/78896818
),然后进行编译。

遇到问题及解决方案

  1. 提示找不到opencv,解决方案:将opencv文件夹手动输入到cmake相关配置中。

  2. 相关报错:

download mklml
[download 0% complete]
[download 1% complete]
[download 2% complete]
CMake Error at cmake/MklDnn.cmake:23 (file):
  file DOWNLOAD HASH mismatch

    for file: [D:/mxnet/test3/mxnet_gpu_vs2015/build/mklml/mklml_win_2018.0.3.20180406.zip]
      expected hash: [8dd73e7d3f19f004551809824c4e8970]
        actual hash: [c537c48196c863652bcce2e894333bac]
             status: [56;"Failure when receiving data from the peer"]

Call Stack (most recent call first):
  CMakeLists.txt:189 (include)

解决方案:此问题在于cmake无法顺利从相应远程服务器下载mklml(网络原因),因此重复进行config,直到能够顺利download相关的库。顺利configure界面见word。

2. vs2015编译

用vs2015打开mxnet\build\mxnet.sln,设置Release x64模式,生成解决方案。成功后就在mxnet\build\Release下得到了我们需要的mxnet.dll(或libmxnet.dll)。
这里写图片描述
遇到问题及解决方案
1. 相关报错:

 fatal error C1083: 无法打开包括文件: “cblas.h”: No such file or directory (编译源文件 D:\mxnet\test3\mxnet\src\resource.cc)

解决方案:原因在于cmake时OpenBLAS配置路径有误,应为D:/mxnet/OpenBLAS-v0.2.19-Win64-int32/include与D:/mxnet/OpenBLAS-v0.2.19-Win64-int32/lib/libopenblas.dll.a

3. c++版本

将我们生成的mxnet.dll拷贝到mxnet\test3\mxnet\cpp-package\scripts下,命令行执行

python OpWrapperGenerator.py mxnet.dll

可在mxnet\cpp-package\include\mxnet-cpp下找到op.h文件,成功。

4. python版本

将mxnet.dll拷到mxnet\python\mxnet下,需要改名为libmxnet.dll(若第二步生成libmxnet.dll则不需要改名),然后在mxnet\python目录下执行:

python setup.py install

安装过程中,python会自动把对应的dll考到安装目录,正常安装完成后,在python中就可以 import mxnet 了。

遇到问题及解决方案
1. import mxnet时相关报错:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "mxnet\__init__.py", line 24, in <module>
    from .context import Context, current_context, cpu, gpu, cpu_pinned
  File "mxnet\context.py", line 24, in <module>
    from .base import classproperty, with_metaclass, _MXClassPropertyMetaClass
  File "mxnet\base.py", line 217, in <module>
    _LIB = _load_lib()
  File "mxnet\base.py", line 208, in _load_lib
    lib = ctypes.CDLL(lib_path[0], ctypes.RTLD_LOCAL)
  File "D:\Python27\lib\ctypes\__init__.py", line 366, in __init__
    self._handle = _dlopen(self._name, mode)
WindowsError: [Error 126]

解决方案:
需在mxnet\python目录下进行setup.py后,在当前目录下import mxnet,或将该目录下的mxnet文件夹设置到环境变量中。

5. 使用C++训练模型

c++工程配置:

  1. 在项目属性-VC++目录-库目录与包含目录中添加mxnet目录。

    • 包含目录:添加 D:\mxnet\test3\mxnet\include;D:\mxnet\test3\mxnet\cpp-package\include;D:\mxnet\test3\mxnet\nnvm\include;D:\mxnet\test3\mxnet\3rdparty\dmlc-core\include;D:\Qt\5.11.1\msvc2015_64\include;
    • 库目录:添加 D:\mxnet\test3\mxnet\build\Release;D:\Qt\5.11.1\msvc2015_64\lib;
  2. 在项目属性-链接器-输入-附加依赖项中添加

    • libmxnet.lib
  3. 将mxnet.dll拷贝到工程目录test\x64\Release下

  4. 实现例子:https://blog.csdn.net/u012234115/article/details/80656030
    (注意实现该文章中的例子时要将相应的model文件夹也拷贝到test\x64\Release下)

配置参考:https://blog.csdn.net/u012234115/article/details/80503086

遇到的问题及解决方案

  1. 相关报错
error MSB8020: The build tools for Visual Studio 2012 (Platform Toolset = 'v110') cannot be found.

解决方案:安装vs2012可以得到v110平台数据集,但因为我们要改为vs2015环境(要用mxnet),因此我设置了vs2015的平台数据集。即在 ‘项目-属性-配置属性-常规-平台数据集’改为Visual Studio 2015(v140)。
2. 相关报错

error C2382: “cbrt”: 重定义;不同的异常规范

解决方案:原因在于vs2015下对重载有不同定义规范,将提示的重定义部分注释掉即可。
3. 相关报错

error C2220: 警告被视为错误 - 没有生成“object”文件

解决方案:这种错误的原因是:原因是该文件的代码页为英文,而我们系统中的代码页为中文。可以点击项目,右击选择属性->配置属性->c/c++->常规,将“警告视为错误”的选项改为“否”。
4. 相关报错

由于找不到xxxxx.dll,无法继续执行代码。重新安装程序可能会解决此问题。

解决方案:将相应ddl文件拷贝到工程目录FEM_Frame\x64\Release下。
5. 相关报错

无法定位程序输入点xxxxx于动态链接库xxxx\xxx.exe上

解决方案:将所有的dll文件(QT及项目下的dll)拷贝到工程目录xxxx\x64\Release中。
6. 相关报错

error LNK2001: 无法解析的外部符号 "__declspec(dllimport) void __cdecl 

解决方案:确认cdecl后面相应的文件在工程项目中且编译生成了相应的obj文件,若还有错误,则设置 属性 -> C,C++ -> 语言 -> 将WChar_t视为内置类型,设置为:否(/Zc:wchar_t-)。
7. 相关报错

1>LINK : warning LNK4098: 默认库“MSVCRT”与其他库的使用冲突;请使用 /NODEFAULTLIB:library

解决方案:在使用多线程调试dll(MDd)模式的时候 <位置:配置属性 - c/c++ -代码生成-运行时库>msvcrtd.lib 与 ibcmt.lib产生冲突

解决方法有2个:
1.右击工程 - 属性 ”配置属性 - 链接器 - 输入 - 忽略特定库“,添加 ”libcmt.lib“
2.右击工程 - 属性 ”配置属性 - 链接器 - 命令行” 添加: /NODEFAULTLIB:”libcmt.lib”
8. 相关报错

error LNK2038: 检测到“RuntimeLibrary”的不匹配项:值“MT_StaticRelease”不匹配值“MD_DynamicRelease”

解决方案:在工程上右键-属性-c/c++-代码生成-运行库改成(release为MT,debug为MTD)即可解决。
9. 相关报错

error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“0”不匹配值“2

解决方案:产生这个问题有两种原因:
1.是当前工程是Debug版本,而引用的库文件时Release版本,只需要把当前的Debug模式改成Release模式就可以了,或者打开解决方案–》属性–》链接器–》输入–》附加依赖项中引用debug版本的lib文件名称。同样,如果检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“2”不匹配值“0”
则说明是Release模式引用了Debug的库文件。这类问题在引用文件时要注意版本的匹配。
2.工程设置中运行库中设置成了”多线程调试 DLL (/MDd)”。这个是设置应该是在debug下的设置,release下应该设置“多线程 DLL (/MD)”。具体在项目-属性-配置属性C/C++ -代码生成-运行库中设定。
10. 相关报错

error LNK2019: 无法解析的外部符号 "int __cdecl xxxxx"

解决方案:内置类型wchar_t的问题,将WChar_t视为内置类型”置为否,在属性-配置属性- C/C++ -语言 中设置。相关详见 https://bbs.csdn.net/topics/390980385
11. 相关报错

错误C2664 无法将参数1const char*转换为CString

解决方案:字符集的问题,项目-属性-配置属性-常规-字符集,选择”使用Unicode字符集”。

猜你喜欢

转载自blog.csdn.net/qq_34062105/article/details/82590553