Table of Contents

Learn BayesOpt

在Windows下编译运行Matlab Interface

安装MATLAB使用的MinGW64编译器

在MATLAB中使用,需要安装MATLAB支持的C/C++编译器,参考Matlab关于MinGW的官方说明,mex不一定要选择MinGW但是BayesOpt文档中使用了MinGW。 最终安装的是Mingw-W64。 安装完插件后,需要用mex -setupmex -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变量中

CMake安装和使用

官方地址下载,正常用默认安装即可。

CMake可以理解成,根据一系列的cmake配置,来生成makefile。最终的makefile文件被编译器的make函数调用(对于上述安装的编译器,是调用mingw32-make.exe,只是mingw32起的不同的名称而已)。

选择下载的BayesOpt源文件地址,设置一个独立的文件夹进行编译(方便弄乱后删除重来),勾选两个设置,然后generate。
generator选择MinGW Makefiles,选择手动设置compiler。
填入上面找到的Matlab的mingw编译器的地址,c/c++/fortran分别对应gcc/g++/gfortran.exe
最终会跳出错误,OK即可,后续继续设置。
这里填入之前指定的Boost源文件的地址。
点Add Entry添加CMAKE_CXX_STANDARD类型为String值为98(BayesOpt官方文档说明使用了C++98标准)。
先configure,再Generate,然后应该就成功了。

如果上述操作弄乱了,直接清空目标文件夹(即图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\文件夹下,这里需要新建liblib\Release文件夹。 (因为在BayesOpt提供的matlab interface编译代码中指定了在Release文件夹下找编译好的libs,所以只要两边改得对应了就可以。)

设置Matlab中的编译器

mex -setup
设置mex的编译器。我这里的mingw显示的名字比较奇怪,似乎两个指向是同一个位置,任选一个即可,不行再换另一个。
把这个matlab文件夹下的三个文件从*.c改为*.cpp。如果不改*.c*.cpp,mex会调用C编译器,导致各种无法找到库的错误。
相应地,把这个compile_matlab文件夹中所有的*.c改为*.cpp
运行后,应该会编译出三个mex文件,注意这里都是使用的c++编译器。

到此结束,应该已经编译完成。

运行demo_*.mat可以测试运行结果。



以下是摸索过程记录,不是操作步骤,仅留作参考(待清理)

安装 MinGW64

MinGW-w64安装教程——著名C/C++编译器GCC的Windows版本,http://rmcantin.github.io/bayesopt/html/install.html#cinwin

https://zhuanlan.zhihu.com/p/76613134

''MinGW+MSYS'' or ''CygWin''

cygwin和mingw选哪个? - ttbachyinsda的回答 - 知乎 https://www.zhihu.com/question/283946185/answer/440495136

关于MinGW和Cygwin的一些个人总结和推测 ,https://xnerv.wang/mingw-cygwin-summary-and-thinking/

MinGW/cygwin 快速开始,https://www.codenong.com/cs100750900/

cygwin和mingw的区别,https://developer.aliyun.com/article/69974

Install MSYS2

https://www.msys2.org/

直接下载安装的。

安装完后可以使用 pacman 包管理工具。

暂时不懂安装这个有什么用。

Install Boost (这步可以跳过,这里不需要提前编译)

https://gist.github.com/sim642/29caef3cc8afaa273ce6

设置环境变量

添加了 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下不支持的函数。

编译

Windows搭建类UNIX环境: Msys2+MinGW,https://www.dazhuanlan.com/2019/12/20/5dfc4b8899600/

似乎C++11对std::string之类的东西进行了修改,导致gcc在link的时候会出问题,很多相关的讨论。 比如

但是我似乎没有碰到这个问题