前言
最近在研究Curvelet,研究的头都大了,所要学习的内容太多,反反复复学西wavelet,ridgelet、radon transform等等,学到头更大,需要借助编程来进行理解。在使用CurveLab时遇到了编译的问题,大约被困扰了四天左右,将一知半解进行记录分享,方便其他人学西。
用过的环境:
- Win10+Matlab2015b+VS2013/VS2015/MinGW(失败)
- Win10+Matlab2020b+VS2013/VS2015/MinGW(失败)
- Win10+Matlab2016b+VS2013/VS2015/VS2017/MinGW(失败)
- Win10+Matlab2017b+TDM-GCC (成功)
结论(猜测):根据多次失败的经验,大胆的猜测问题在于VS自带的编译器,而不是Matlab的版本问题参考的多篇博文也有提到:VS自带编译器存在一些问题,大神可以忽略以上废话,想用什么编译器就用什么编译器,这都是无所谓的。如果小白的话,建议还是把VS的编译环境卸载了吧,问题太多 >_<
要解决的问题: - 错误使用 mex fdct_wrapping_param_mex.cpp
- fatal error C1083: 无法打开包括文件: “fftw.h”: No such file or directory
- fdct_wrapping_param_mex.mexw64 : fatal error LNK1120: 1 个无法解析的外部命令
- fdct_wrapping_param_mex.obj : error LNK2019: 无法解析的外部符号
文章目录
一、下载链接
整个问题的解决过程基本上会用到一下工具:
二、遇到问题&解决问题
2.1 fatal error C1083: 无法打开包括文件: “fftw.h”: No such file or directory
(1)我们在Matlab命令行窗口输入以下命令mex-setup,可以看到如下图所示。(其实这里我已经单独安装了MinGW-w64,但是为什么编译器里为什么不显示呢?有各种各样的解决办法,大家可以暂时不用理会,到最后我也没有用到自己安装的MinGW-w64)
mex -setup
(2)点击“mex -setup C++”
(3)在命令行窗口输入:
mex fdct_wrapping_param_mex.cpp
报错如下:
到这儿就是错误开始的第一步,因为CurveLab进行了Matlab和.cpp的混合编程,对于混合编程的我来说,我能想到的解决办法,就是使用Matlab自带的mex编译工具,当在我自己电脑上报错后,我又使用了其他人的电脑进行编译,结果出现了同样的错误,这证明了可能不是我电脑的问题。
问题分析 fatal error C1083: 无法打开包括文件: “fftw.h”: No such file or directory,我的第一反应是,fftw.h头文件缺失,那就把它加进来吧,那么问题来了,fftw.h文件在哪儿呢,在CurveLab2.1.3下是找不到,这个文件是其依赖的ffwt-2.1.5里的文件。于是我把ffwt-2.1.5下载了下来,并且将该文件放了进来。
2.2 fdct_wrapping_param_mex.mexw64 : fatal error LNK1120: 1 个无法解析的外部命令
把fftw.h放入CurveLab再进行编译,就变成了以上的问题。这就很离谱了,离谱的不是这个错误,二是这个将这个错误粘贴到百度搜索,竟然没有匹配的答案,离谱啊!!!
解决办法:在国际版的Bing进行英文检索,可喜可悲有类似的问题,我们来看一下:
(怎么说呢,真让人头大!English!!!!!,离谱)
参考链接我也放在这里,供大家直接查阅:
我觉得这里面问的问题和回答也是很有意思,我们来看一下:
如果有道翻译没有翻译错的话,这个人的意思应该是:我再WIndows下编译FFTW遇到了麻烦,然后我去Ubuntu下进行了编译,然后它的问题解决了。(怎么说?Congulations?Unbuntu本来就容易编译成功)。
来,我们看一下官方文档:The C++ implementation is tested on Unix-type platforms, including Linux,
SunOS and MacOS.
- CurveLab Toolbox, Version 2.0
至此,我们差不多已经有了问题的解决方案,大家也可以参考 - Windows 编译 FFTW 2/3 以及安装CurveLab ,在此特别感谢我的白衣年代。这篇博文,言简意赅对于小白可能有些困难,有问题,可以继续往下看
三、安装MSYS2、TDM-GCC、MinGW64
3.1安装MinGW-w64
(注:MinGW-w64的安装可看可不看,因为我最后编译成功的确没有用到这个,但是过程中用了太多次,就顺手给写上了。)
(1)下载 - MinGW-w64
(2)点击MingW-W64builds(3)点击SourceForge
(4)下载安装:
(5)安装选项:
重点就在这一步,其他的一路Next就好了,不懂的可以搜索更详细的博客,这里做一个简答解释:x86_64代表64位编译,win32代表用Windows编译,seh更新更稳定。
3.2安装MSYS2
(1)下载 - MSYS2
安装过程跟3.1基本上一模一样,别问我为什么这么说,点进去就知道了。
(2)注意需要利用msys2安装上make,在msys2中,输入
pacman -S make
即可自动安装。
(3) MSYS2和MinGW-w64安装完成后需要配置一下环境变量,将MingGW-w64以及msys2的bin目录添加到系统路径,如下图所示:
3.3安装TDM-GCC
(1)下载: - TDM-GCC
尽量下载比较新的版本。
(2)直接存储在C盘跟目录下,不要有子目录,路径中不要有空格。
(3)安装完成后,在Matlab命令行:设置变量环境:其中’D:\TDM-GCC-64’为安装TDM-GCC-64的路径,请设置位你自己的安装路径。
setenv(‘MW_MINGW64_LOC’,’D:\TDM-GCC-64’)
(4)如果不想每次都设置环境,就直接在系统中添加环境变量即可。变量名:MW_MINGW64_LOC,路径:D:\TDM-GCC-64。
(5)使用过程中可能会报错:“您使用的是不受支持的 MinGW 编译器版本。要安装支持的 MinGW 编译器版本”
莫慌,不要怕,这是内部printf的输出,无需关注。
至此,需要的不需要的我们都安装上了,nice!!!
3.4使用Bash环境
为什么要使用bash环境呢,因为使用msys2和MinGW-W64进入文件路径,我觉得还是一件很麻烦的事情,非常不方面。那么我们接下来,配置一下,使可以从cmd直接进入bash环境。
(1)我们打开Windos设置,选择更新和安全。
(2)点击开发者选项:
(3)将开发人员模式打开:
四、编译FFTW-2.1.5
(1)下载 - FFTW-2.1.5并解压缩到文件。
避免大家混乱,给大家看一下我的上层路径:
其中fftw-2.1.5是要进入的路径,fftw2是我新建的,准备install的文件夹。
(2)打开cmd,进入fftw-2.1.5路径(有很多中方式,这里我推荐这种:直接在路径处输入cmd,然后回车进入)
(3)在cmd窗口键入bash,即可进入bash环境:
(4)设置编译配置,输入:
./configure --prefix=/your/install/path --with-pic
因为这里我要安装到fftw2文件,所以我输入的是:
./configure --prefix=/e/Software/Matlab2020/MyProject/SparseImageadnSignalProcessing/fftw2 --with-pic 你可以根据自己的路径进行设置。
有的电脑可以通过,有的不可以,如果报如下configure:error:
如果产生此类错误,莫慌!,补充一些信息即可,输入以下指令就可解决:
./configure --build=x86_64 --prefix=/e/Software/Matlab2020/MyProject/SparseImageadnSignalProcessing/fftw2 --with-pic
(5)在cmd命令行输入:make 进行编译,编译会持续一段时间,时间长短,视电脑性能而定。
(6)在cmd命令行输入:make install开始安装,文件会安装到fftw2,安装后的文件如下图所示:
其实到现在我也没明白,这个fftw2的意义是什么,通过看后面的makefile.opt文件跟fftw2没有一点关系,同时我还测试了使用fftw-2.1.5和fftw2产生的结果是一样的,这个地方实在是不理解,有懂得可以评论区留言交流一下>_<
五、编译CurveLab2.1.3
(1)cmd进入curveLab2.1.3所在路径。
(2)修改makefile.opt文件
a).修改FFTW_DIR的值为fftw-2.1.5的绝对路径。
b).修改MTALB_DIR的值为Matlab的安装路径。
c).修改MEX程序的路径。
d).修改mex.h头文件所在的路径。
大家照葫芦画瓢,自行去理解吧,我实在是给不出有效的解释>_<
(3)在cmd中输入make lib,编译静态链接库文件。
(5)在cmd中输入make matlb,编译mex文件。
至此,大功告成,功德无量!!
如果你不想如此蒙混过关,想知其所以然,强烈建议你参考这篇博文: - Makefile教程(绝对经典,所有问题看这一篇足够了)
我是不行了,基本上废了。
六、参考链接
- error LNK2019 when trying to use C++ program of CurveLab-2.1.3
- How to use MEX files in Matlab?
- CurveLab Toolbox, Version 2.0
- Windows 编译 FFTW 2/3 以及安装CurveLab
- matlab R2016a 未找到支持的编译器或SDK 配置MinGW-w64 C/C++ 编译器
- Makefile教程(绝对经典,所有问题看这一篇足够了)
温馨提示:这里对文章进行总结:学海无涯,回头是岸!