使用 Cygwin 和 Intel Parallel Studio 编译 IPOPT

问题描述

我正在尝试使用 Cygwin 在 Windows 中编译IPOPT 3.13.3。我有一份英特尔 Parallel Studio 2019 的副本,并且正在尝试使用英特尔编译器以及此安装中的英特尔 MKL。这是我的过程:

  1. 启动英特尔编译器 64 位命令提示符
  2. 运行 Cygwin.bat 以启动 cygwin bash 终端。我可以确认 ifort 和 icl 在路径上并将运行
  3. 导航到 ipopt 源文件夹并运行 ./configure --enable-mscv

从这里开始,它发现编译器很好,直到尝试从 MKL 获取 lapack 为止:

checking for function dsyev_ in /cygdrive/c/Program Files (x86)/INTELS~1/COMPIL~1.144/windows/mkl/lib/INTEL6~1/mkl_intel_lp64_dll.lib /cygdrive/c/Program Files (x86)/INTELS~1/COMPIL~1.144/windows/mkl/lib/INTEL6~1/mkl_sequential_dll.lib /cygdrive/c/Program Files (x86)/INTELS~1/COMPIL~1.144/windows/mkl/lib/INTEL6~1/mkl_core_dll.lib ... no
checking for function dsyev in /cygdrive/c/Program Files (x86)/INTELS~1/COMPIL~1.144/windows/mkl/lib/INTEL6~1/mkl_intel_lp64_dll.lib /cygdrive/c/Program Files (x86)/INTELS~1/COMPIL~1.144/windows/mkl/lib/INTEL6~1/mkl_sequential_dll.lib /cygdrive/c/Program Files (x86)/INTELS~1/COMPIL~1.144/windows/mkl/lib/INTEL6~1/mkl_core_dll.lib ... no
checking for function DSYEV_ in /cygdrive/c/Program Files (x86)/INTELS~1/COMPIL~1.144/windows/mkl/lib/INTEL6~1/mkl_intel_lp64_dll.lib /cygdrive/c/Program Files (x86)/INTELS~1/COMPIL~1.144/windows/mkl/lib/INTEL6~1/mkl_sequential_dll.lib /cygdrive/c/Program Files (x86)/INTELS~1/COMPIL~1.144/windows/mkl/lib/INTEL6~1/mkl_core_dll.lib ... no
checking for function DSYEV in /cygdrive/c/Program Files (x86)/INTELS~1/COMPIL~1.144/windows/mkl/lib/INTEL6~1/mkl_intel_lp64_dll.lib /cygdrive/c/Program Files (x86)/INTELS~1/COMPIL~1.144/windows/mkl/lib/INTEL6~1/mkl_sequential_dll.lib /cygdrive/c/Program Files (x86)/INTELS~1/COMPIL~1.144/windows/mkl/lib/INTEL6~1/mkl_core_dll.lib ... no

然后继续检查 cygwin 包中的 blas/lapack(无论如何我都不想这样做),但也失败了:

checking for lapack.pc and blas.pc... yes
checking for function dsyev_ in -llapack  ... no
checking for function dsyev in -llapack  ... no
checking for function DSYEV_ in -llapack  ... no
checking for function DSYEV in -llapack  ... no
configure: WARNING: lapack.pc and blas.pc present,but could not find dsyev when trying to link with it.
checking for function dsyev_ in -llapack -lblas ... no
checking for function dsyev in -llapack -lblas ... no
checking for function DSYEV_ in -llapack -lblas ... no
checking for function DSYEV in -llapack -lblas ... no
configure: error: Required package LAPACK not found.

我尝试使用 --with-lapack 标志手动添加各种库组合,例如此处建议的:Linking Ipopt with Intel MKL,但我通常得到相同的结果。这是我尝试的另一个命令:

./configure --enable-msvc --with-lapack=" -L${MKLROOT}/lib/intel64 -lmkl_intel_lp64 -lmkl_core -lmkl_intel_thread -liomp5 -lpthread -lm -ldl"

这是输出:

checking for function dsyev_ in  -LC:\Program Files (x86)\IntelSWTools\compilers_and_libraries_2019.1.144\windows\mkl/lib/intel64 -lmkl_intel_lp64 -lmkl_core -lmkl_intel_thread -liomp5 -lpthread -lm -ldl ... no
checking for function dsyev in  -LC:\Program Files (x86)\IntelSWTools\compilers_and_libraries_2019.1.144\windows\mkl/lib/intel64 -lmkl_intel_lp64 -lmkl_core -lmkl_intel_thread -liomp5 -lpthread -lm -ldl ... no
checking for function DSYEV_ in  -LC:\Program Files (x86)\IntelSWTools\compilers_and_libraries_2019.1.144\windows\mkl/lib/intel64 -lmkl_intel_lp64 -lmkl_core -lmkl_intel_thread -liomp5 -lpthread -lm -ldl ... no
checking for function DSYEV in  -LC:\Program Files (x86)\IntelSWTools\compilers_and_libraries_2019.1.144\windows\mkl/lib/intel64 -lmkl_intel_lp64 -lmkl_core -lmkl_intel_thread -liomp5 -lpthread -lm -ldl ... no
configure: error: Could not find dsyev in Lapack

我确实担心 MKL 的路径中有空格(呃,Windows!),但我尝试将库复制到另一个路径并链接到该路径,但它没有改变结果。

我还从 cygwin 目录中删除了 GNU link.exe,以便运行 link --version 确认我正在使用 Microsoft 链接器(根据此处的建议:Installing and using IPopt with Cygwin - or even better alternative?

我的互联网研究没有得到更多答案。如果有人对这里的操作有任何建议,请提前致谢!

解决方法

它应该是 --enable-msvc 而不是 --enable-mscv

最好确保在库搜索路径中找到 MKL 库。然后配置应该只是自动选择它们。否则,尝试使用 DOS 风格的短路径,链接器标志 (https://github.com/coin-or/Ipopt/issues/472#issuecomment-842446604) 没有空格。

此外,如果 configure 中的测试失败,请查看 config.log 文件以了解详细信息。

应该不需要删除link.exe。 Ipopt 附带的 compile 脚本中有一个解决方法。

PS:我没试过cygwin。 msys2 对我有用。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...