环境:
相关资源百度云链接:https://pan.baidu.com/s/1pkPzm9vVRkHRc6KOkiyX9g 密码:2848
编译成功的项目百度云链接(在基础配置相同的情况下可以直接使用
):https://pan.baidu.com/s/1By5PeiORcvRFSysBGF5UOQ 密码:m87s
通过实验证明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
首先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
),然后进行编译。
遇到问题及解决方案:
提示找不到opencv,解决方案:将opencv文件夹手动输入到cmake相关配置中。
相关报错:
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。
用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
将我们生成的mxnet.dll拷贝到mxnet\test3\mxnet\cpp-package\scripts下,命令行执行
python OpWrapperGenerator.py mxnet.dll
可在mxnet\cpp-package\include\mxnet-cpp下找到op.h文件,成功。
将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 "" , 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文件夹设置到环境变量中。
c++工程配置:
在项目属性-VC++目录-库目录与包含目录中添加mxnet目录。
在项目属性-链接器-输入-附加依赖项中添加
将mxnet.dll拷贝到工程目录test\x64\Release下
实现例子:https://blog.csdn.net/u012234115/article/details/80656030
(注意实现该文章中的例子时要将相应的model文件夹也拷贝到test\x64\Release下)
配置参考:https://blog.csdn.net/u012234115/article/details/80503086
遇到的问题及解决方案:
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 无法将参数1从const char*转换为CString
解决方案:字符集的问题,项目-属性-配置属性-常规-字符集,选择”使用Unicode字符集”。