0

我正在尝试使用 Cygwin 在 Windows 中编译 IPOPT 3.13.3。我有一份 Intel Parallel Studio 2019 的副本,我正在尝试使用此安装中的 Intel 编译器和 Intel MKL。这是我的过程:

  1. 启动 Intel 编译器 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 - 甚至更好的选择?

我的互联网研究没有产生更多的答案。如果有人对这里的操作有什么建议,请提前感谢您!

4

1 回答 1

0

它应该--enable-msvc代替--enable-mscv.

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

此外,如果配置中的测试失败,请查看 config.log 文件以获取详细信息。

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

PS:我没有尝试过cygwin。msys2 为我工作。

于 2021-05-17T16:37:11.223 回答