windows 下编译 Ipopt 3.12

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系统上可以通过 MinGWMSYS2windows下的linux子系统 提供Linux环境支持。这里我按照Ipopt官网的教程使用的是 MSYS2

MSYS2 可以在 https://www.msys2.org/ 下载。选择64位的版本下载安装。

装好后可以在开始菜单中找到MSYS的快捷方式,注意如果要编译64位的库需要启动64位的MSYS2。

msys2startmenu

打开后的界面是这样的:

msys2Window

出现了一个终端,它默认的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 若有类似下图的输出说明可以成功找到这两个编译器了。

clifortfound

之后安装一些编译过程中需要的软件

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的分支,下错版本很可能编译不过)

thirdparty

例如下载 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.exebin 文件夹下:

ipoptexe

可以看到大小有97兆,说明其用到的各种库都被静态链接进去了。

头文件存放在include目录下:

include

库文件存放在lib文件夹下:

lib

另外在share\coin\doc\Ipopt文件夹下存放了ipopt_addlibs_*.txt文件,这几个文件描述了使用ipopt库时需要链接的库有哪些:

ipoptlink

在使用时可以将lib和include文件夹直接复制到工程目录中,配置好包含目录以及附加库即可。


欢迎关注我的微信公众号 江达小记

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章