Ipopt这个库在linux下编译是很容易的,但是在windows下想用它就很麻烦了。
官方只提供了较旧版本的Ipopt的编译版本,只能用在较旧版本的vs上。如果想用新版本或支持新的vs则只能自行编译。而Ipopt官网的windows编译教程写的不清不楚,按照官网的教程根本无法成功编译。
官网教程地址:https://coin-or.github.io/Ipopt/INSTALL.html
Ipopt 3.12官方的说明文档:https://projects.coin-or.org/Ipopt/browser/stable/3.12/Ipopt/doc/documentation.pdf?format=raw
下面我把这两周折腾编译的成果记下来分享给大家,方便有同样需求的朋友少走些弯路。
准备编译环境
Ipopt 需要在 Linux 环境下编译,在Windows系统上可以通过 MinGW 或 MSYS2 或 windows下的linux子系统 提供Linux环境支持。这里我按照Ipopt官网的教程使用的是 MSYS2 。
MSYS2 可以在 https://www.msys2.org/ 下载。选择64位的版本下载安装。
装好后可以在开始菜单中找到MSYS的快捷方式,注意如果要编译64位的库需要启动64位的MSYS2。
打开后的界面是这样的:
出现了一个终端,它默认的home文件夹在C:\msys64\home
中,接下来需要配置环境变量使得在该环境中可以找到vs的编译器 cl 连接器 link 以及Intel Fortran编译器 ifort 的位置。这里我的vs版本为 Visual Studio 2015 , intel fortran 的版本为 Intel Parallel Studio XE 2018
为了方便我写了个bat脚本实现相应环境变量的配置
set MSYS2_PATH_TYPE=inherit
call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x86_amd64
call "C:\Program Files (x86)\IntelSWTools\compilers_and_libraries\windows\bin\ifortvars.bat" intel64 vs2015
C:\msys64\mingw64.exe
exit 0
将这段代码中对应的msys可执行文件以及vs和intel fortran的位置改成读者自己电脑上相应的位置即可,最后保存为bat文件双击就可用了。
输入 cl 以及 ifort 若有类似下图的输出说明可以成功找到这两个编译器了。
之后安装一些编译过程中需要的软件
pacman -S binutils diffutils git grep make patch pkg-config
在用pacman装软件的过程中可能会因为 显而易见 的原因导致网速很慢甚至下载失败,可以通过更改软件源或设置 http_proxy 环境变量配置代理来解决,这里因为我使用软路由不存在网络问题就没有进行上述设置。
然后还需要把C:\msys64\usr\bin
文件夹下的 link.exe 以及 ln.exe 改名为 link.exe.bak ln.exe.bak 前者是防止链接的时候使用了linux下的链接器导致链接失败,后者是为了防止创建出linux软链接导致vs的编译器无法识别。
下载源码
用 git 下载源码(在git下载源码过程中同样因为 显而易见 的原因出现网络问题,需要配置git的代理解决),注意这里的方法只能编译 Ipopt 3.12 无法编译最新的 Ipopt 3.13。相应的命令如下:
git clone -b stable/3.12 https://github.com/coin-or/Ipopt.git CoinIpopt
之后进入 CoinIpopt 目录,进入 ThirdParty 目录
cd CoinIpopt/ThirdParty/
如果是用 git 直接下载的话这里应该是空的,因为这些库是在git上以链接的形式存放的我们需要到 GitHub 上找到 ThirdParty 目录之后把这几个链接下载下来放到相应的文件夹里:
(注意:需要选择stable/3.12的分支,下错版本很可能编译不过)
例如下载 ASL 可以点击 ASL @ f0b17f3 之后跳出一个新的 GitHub 页面 然后点击 Clone or download 下载zip压缩包然后把文件解压到 CoinIpopt/ThirdParty 下的 ASL 文件夹即可(需要自行创建ASL文件夹)
之后执行下列操作下载 Blas、Lapack、ASL、Metis、Mumps 的源码:
cd Blas/
./get.Blas
cd ../Lapack/
./get.Lapack
cd ../ASL
./get.ASL
cd ../Metis/
./get.Metis
cd ../Mumps/
./get.Mumps
HSL 的源码比较特殊它提供两个版本,一个是开源的老版本只支持MA27求解器,另外是需要付费购买的完整版本,如果是学生的话可以发邮件注册使用教育版但是比较麻烦。这里我用的是学长给我的源码。
将 HSL 的源码解压到 ThirdParty/HSL 目录下并重命名为 coinhsl 即可。
到此,所有源码已经下载完毕,接下来开始编译。
进行编译
首先进入CoinIpopt 文件夹中,输入以下命令使用msvc进行配置:
./configure --enable-doscompile=msvc
此时开始检查环境信息配置相关文件生成 makefile。
如果最终出现 Main Ipopt configuration successful 说明配置成功,接下来可以用make
命令进行编译了。
为了加快编译速度可以使用 make -j4
使用多个线程同时编译。
编译会花费2个小时左右,这期间可以打会儿游戏。
如果 make
命令执行完后没有任何报错,说明编译成功了,可以松一口气了。
接下来执行 make test
命令进行测试,如果上一步成功的话,这一步也很快就通过了,会在CoinIpopt\Ipopt\test 生成 hs071_*.exe
的可执行文件同时终端上也会提示测试成功。
库的安装及使用
最后执行 make install
它默认会把库安装在 C:\msys64\mingw64
下,其中生成的可执行文件 ipopt.exe 在 bin 文件夹下:
可以看到大小有97兆,说明其用到的各种库都被静态链接进去了。
头文件存放在include目录下:
库文件存放在lib文件夹下:
另外在share\coin\doc\Ipopt
文件夹下存放了ipopt_addlibs_*.txt
文件,这几个文件描述了使用ipopt库时需要链接的库有哪些:
在使用时可以将lib和include文件夹直接复制到工程目录中,配置好包含目录以及附加库即可。
欢迎关注我的微信公众号 江达小记