安装 glpk-hs

Installing glpk-hs

我一直在尝试在我的 Haskell 项目中使用 glpk-hs,但我完全不知道该怎么做。我正在使用 stack 到 运行 我的程序,我的困惑很可能是因为我对它的工作原理缺乏了解。

也就是说,我已经下载了 glpk-hs-0.7 并将解压的文件夹放在我的项目文件夹中。我正在 运行 将我的代码与 stack ghci my_program.hs 结合,对 stack.yaml 文件具有以下依赖性:

"extra-deps: - gasp-1.2.0.0 - glpk-hs-0.7"

它成功安装了 gasp 但安装 glpk 失败并出现此错误:glpk-hs > * Missing (or bad) C library: glpk.
我还尝试通过下载可执行文件并将其添加到 PATH 来为 Windows 安装 glpk,当我在 cmd 上 运行 glpsol 时给出此消息:

GLPSOL: GLPK LP/MIP Solver, v4.65 No input problem file specified; try glpsol --help

我错过了什么?我注意到在 glpk-hs-0.7/glpk 文件夹中有一个 glpk.c 文件。我应该编译并执行这个程序吗?

顺便说一句,我现在 运行 正在使用 Windows 10,但我主要在 Linux 机器上工作,所以我希望有一个适用于两个系统的解决方案,如果有一个。

谢谢!

glpk-hs 软件包为 单独安装的 GLPK 库提供了 GHC 接口,但安装 glpk-hs 不会自动安装所需的库。编译包的 "glpk.c" 文件无济于事,因为那只是一些有助于构建接口的存根 C 代码。 (绝大多数为其他库提供 "bridge" 的 GHC 包都是以这种方式设计的,因此 glpk-hs 不是特例。)

在 Linux 下,您需要使用发行版的包管理器以 "usual" 的方式安装 GLPK 包的开发版本(例如,对于基于 Debian 的发行版,您需要运行 apt install libglpk-dev) 在尝试(重新)安装 glpk-hs 包之前。

在 Windows 下,我想从 GLPK for Windows Project Page 下载带有预编译二进制文件的 zip 文件可能是最简单的。在方便的地方将其解压缩,并按照该网页上的说明,将 32 位或 64 位 DLL(视情况而定)复制到 c:\windows\system32 目录。

为了 stack 针对库进行构建,它需要一些额外的库并包含指定的文件目录。在您的项目特定 stack.yaml(或全局 config.yaml)中,您需要添加指向适当解压缩路径的行。例如,类似(假设是 64 位环境):

# in stack.yaml or config.yaml
extra-lib-dirs:     ["c:\users\XXXXX\glpk-4.65\w64"]
extra-include-dirs: ["c:\users\XXXXX\glpk-4.65\src"]

此外,我 运行 遇到了另一个问题,因为 Cabal 正在寻找 glpk.lib 而不是 glpk_4_65.lib,所以我不得不将库复制过来。我不确定是否有更好的方法来做到这一点。

> cd c:\users\XXXXX\glpk-4.65\w64
> cp glpk_4_65.lib glpk.lib

现在,最新的 glpk-hs-0.7 软件包与当前的 GHC containers 版本不兼容,因此您需要在 stack.yaml 文件中使用较早的解析器。 lts-12.26 解析器对我有用:

# in stack.yaml
resolver: lts-12.26

最后,GLPK 仅适用于线程 运行 时间,因此请将标志添加到您的 .cabal 文件中:

-- in your .cabal file
executable glpktest
  ghc-options: -threaded -O2

您可以从 https://github.com/jyp/glpk-hs/blob/master/examples/example1.hs 中获取示例。删除 import Algebraic.Classes 行,因为它不需要,并在 .cabal 文件中添加以下 executable 子句:

-- in your .cabal file
executable glpktest
  hs-source-dirs:    src
  main-is:           Example1.hs
  default-language:  Haskell2010
  build-depends:     base >= 4.7 && < 5
                   , glpk-hs
                   , containers
  ghc-options:       -threaded -O2

和以下stack.yaml

-- full stack.yaml contents

resolver: lts-12.26

packages:
- .

extra-deps:
- glpk-hs-0.7
- gasp-1.2.0.0

extra-lib-dirs:     ["c:\users\XXXXX\glpk-4.65\w64"]
extra-include-dirs: ["c:\users\XXXXX\glpk-4.65\src"]

你应该能够stack buildstack exec glpktest那个例子。如果可执行文件构建正确但 运行ning 它没有产生任何输出,则可能是因为未找到 DLL。确保已将正确的 DLL 集复制到 c:\windows\system32.

总结假设 64 位环境的所有步骤:

  1. 从 winglpk 项目下载并解压预编译的二进制文件
  2. 将 DLL 从 w64 目录复制到 c:\windows\system32
  3. w64目录下,复制glpk_4_65.libglpk.lib
  4. 将上面的 stack.yaml 与解析器 lts-12.26 和适当的目录设置一起使用。
  5. 尝试将上面给出的 executable 子句 stack build 上面链接的 Example1.hs (先删除不必要的 import 行)复制到你的 .cabal文件(包括 -threaded GHC 选项)
  6. 使用 stack exec glpktest,您将有望看到打印的解决方案(x1=40、x2=50 和 x3=0)。