Table of Contents
Learn BayesOpt
在Windows下编译运行Matlab Interface
- 所有操作尽量避免在文件路径中有空格,避免不必要的麻烦。如果出现奇怪的错误,先google一下是不是跟空格有关。
- 在Windows写路径永远注意
/
和\
的区别,不确定的时候就google一下。
安装MATLAB使用的MinGW64编译器
在MATLAB中使用,需要安装MATLAB支持的C/C++编译器,参考Matlab关于MinGW的官方说明,mex不一定要选择MinGW但是BayesOpt文档中使用了MinGW。
最终安装的是Mingw-W64。
安装完插件后,需要用mex -setup
,mex -setup C++
选择相应的编译器。
(这里不需要这一步)如果要安装编译环境,只需要安装MSYS2,然后在MSYS2中安装好mingw64就好。不需要独立安装mingw64,cygwin等环境。 MSYS2之于C/C++可以近似类比于Anaconda之于python。
谷歌找到MATLAB mex安装的mingw64的路径,当前R2020a是:
C:/ProgramData/MATLAB/SupportPackages/R2020a/3P.instrset/mingw_w64.instrset/bin/ C:\ProgramData\MATLAB\SupportPackages\R2020a\3P.instrset\mingw_w64.instrset\bin\ (windows格式)
上述地址要添加到环境变量中。 因为后面CMake需要能看到mingw32-make才可以。
下载Boost
不需要独立编译,BayesOpt会自动编译,只需要从官方地址下载,然后解压到一个位置即可,比如我放在了:
C:/Tools/boost/boost_1_75_0 C:\Tools\boost\boost_1_75_0 (windows格式)
Boost是C++的peer-reviewed portable C++ source libraries。似乎是很多项目的必备。
检查最终的环境变量
进行下一步前,检查一下系统环境变量中的设置,这里只考虑最简单的情况。
在系统Path
变量中
- 应该只包含Matlab使用的编译器的
bin
文件夹的路径,这个路径应该只出现在这里。这步保证mingw32-make.exe
可以被CMD找到。 - 不包含其它Matlab的路径,否则有可能会导致
nlopt
被解析到Matlab自带的某个nlopt。 - 编译BayesOpt不需要有Boost和cmake的路径。
CMake安装和使用
从官方地址下载,正常用默认安装即可。
CMake可以理解成,根据一系列的cmake配置,来生成makefile。最终的makefile文件被编译器的make函数调用(对于上述安装的编译器,是调用mingw32-make.exe,只是mingw32起的不同的名称而已)。
如果上述操作弄乱了,直接清空目标文件夹(即图1中where to build the binaries的文件夹),然后就可以重新操作了。 更高级的操作直接各种google cmake的用法。
调用Matlab的mingw编译器中的make
在CMD下定位到cmake的输出文件夹,然后运行编译:
mingw32-make
等编译完即可。
这里有可能NLOPT报错,检查一下cmake中的NLOPT参数是否被解析到了其它路径,应该是用默认的NLOPT-NOTFOUND
,然后BayesOpt会编译自带的nlopt2。
在MATLAB中的设置
把上一步编译好的bayesopt-test/lib/*.a
文件,全部复制到bayesopt-master\lib\Release\
文件夹下,这里需要新建lib
和lib\Release
文件夹。
(因为在BayesOpt提供的matlab interface编译代码中指定了在Release
文件夹下找编译好的libs,所以只要两边改得对应了就可以。)
设置Matlab中的编译器
mex -setup
到此结束,应该已经编译完成。
运行demo_*.mat
可以测试运行结果。
以下是摸索过程记录,不是操作步骤,仅留作参考(待清理)
安装 MinGW64
MinGW-w64安装教程——著名C/C++编译器GCC的Windows版本,http://rmcantin.github.io/bayesopt/html/install.html#cinwin
''MinGW+MSYS'' or ''CygWin''
cygwin和mingw选哪个? - ttbachyinsda的回答 - 知乎 https://www.zhihu.com/question/283946185/answer/440495136
- 先解释一下这俩的区别,cygwin是在windows下模拟了一套类似UNIX的环境;mingw是将一些UNIX/Linux的系统调用映射成windows下的系统调用,从而使得原来在Linux下编译运行的程序可以在windows下编译运行。
关于MinGW和Cygwin的一些个人总结和推测 ,https://xnerv.wang/mingw-cygwin-summary-and-thinking/
- “MinGW(mingw32)据说更新太慢代码太老,因此另一帮人就新搞了一个MinGW-w64,据说老的MinGW不支持编译64位程序。不知道是不是这就意味着可以完全放弃掉MinGW而直接采用MinGW-x64?”
- 根据MinGW官网对于MSYS的描述,MSYS是对MinGW的补充,提供了bash,make, gawk和grep等GNU工具来辅助编译。
MinGW/cygwin 快速开始,https://www.codenong.com/cs100750900/
- 安装 MinGW-w64
cygwin和mingw的区别,https://developer.aliyun.com/article/69974
- 说白了,如果你是想在windows环境下开发linux运行程序,那么CygWin/gcc是你的不二之选。
- 而如果你想开发的是windows运行程序,并且追求速度,那么二者相比而言,MinGW是更好的选择
Install MSYS2
Install Boost (这步可以跳过,这里不需要提前编译)
设置环境变量
添加了 cmake
, mingw64
, Boost
到系统环境变量。
CMake GUI 使用
选择 MINGW MAKEFILE
作为 generator。
需要手动设置 boost 的地址。只需要提供 source file 的地址即可,不需要编译后安装。
然后在运行Cmake GUI的目录下,在cmd中运行 mingw32-make 就可以了。
以上失败了。 因为matlab只支持自己版本的mingw。
把上述所有mingw64的地址换成matlab自己的官方compiler,然后重新进行。
在matlab中执行 mex -setup
的过程中,会看到安装的编译器的地址,这里是
C:/ProgramData/MATLAB/SupportPackages/R2020a/3P.instrset/mingw_w64.instrset/bin/
只要勾选了 BAYESOPT_BUILD_EXAMPLES
就会编译过程中失败,报错似乎跟某个地方的文件操作有关,猜测是 exmaple 中调用了在windows下不支持的函数。
- 最终发现是 cmake 在设置 compiler 的时候,我把 c/c++/fortran 全部设置为了 gcc.exe,实际上应该分别是 gcc/g++/gfortran.exe,改掉之后重新编译就可以了。
- 仍然报错
编译
Windows搭建类UNIX环境: Msys2+MinGW,https://www.dazhuanlan.com/2019/12/20/5dfc4b8899600/
- 根据这里安装 msys2
- 官方的安装教程也很有用,https://www.msys2.org/
- 然后在 msys2 中安装 mingw64,而不是独立安装,把独立安装的全部删除掉
- 注意添加相应的环境变量
似乎C++11对std::string之类的东西进行了修改,导致gcc在link的时候会出问题,很多相关的讨论。 比如
但是我似乎没有碰到这个问题