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文件夾直接複製到工程目錄中,配置好包含目錄以及附加庫即可。


歡迎關注我的微信公衆號 江達小記

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