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 3.12的部分参考Ipopt 3.12的文档,这文档也是找了半天才找到的。本文只适用于Ipopt 3.12。
下面我把这两周折腾编译的成果记下来分享给大家,方便有同样需求的朋友少走些弯路。
准备编译环境
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=inheritcall "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x86_amd64call "C:\Program Files (x86)\IntelSWTools\compilers_and_libraries\windows\bin\ifortvars.bat" intel64 vs2015C:\msys64\mingw64.exeexit 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.Blascd ../Lapack/./get.Lapackcd ../ASL./get.ASLcd ../Metis/./get.Metiscd ../Mumps/./get.Mumps
HSL 的源码比较特殊它提供两个版本,一个是开源的老版本只支持MA27求解器,另外是需要付费购买的完整版本,如果是学生的话可以发邮件注册使用教育版但是比较麻烦。这里我用的是学长给我的源码。
将 HSL 的源码解压到 ThirdParty/HSL 目录下并重命名为 coinhsl 即可。
到此,所有源码已经下载完毕,接下来开始编译。
进行编译
首先进入CoinIpopt 文件夹中,输入以下命令使用msvc进行配置:
./configure --enable-doscompile=msvc
默认会编译 release 版的静态库,如果需要 debug 版的静态库则需要增加 --enable-debug
如果需要额外的运行时检查则增加 --with-ipopt-checklevel=1
这样会对运行速度有很大影响。(在官方的文档中说默认是编译成动态库的,但是不知道为什么我电脑上默认编译出来的是静态库……)
此时开始检查环境信息配置相关文件生成 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文件夹直接复制到工程目录中,配置好包含目录以及附加库即可。
欢迎关注公众号 江达小记