正在安装glpk-hs

问题描述 投票:3回答:1

我一直在尝试在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文件。我应该编译并执行该程序吗?

Btw,我现在在Windows 10上运行,但是我主要在Linux机器上工作,因此,如果有的话,我希望能对两个系统都适用的解决方案。

谢谢!

haskell cabal glpk stackage
1个回答
2
投票

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

[在Linux下,您需要使用发行版的软件包管理器以“常规”方式安装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行,因为它不需要,并在executable文件中包含以下.cabal子句:

-- 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该示例。如果可执行文件正确生成,但运行却未产生任何输出,则可能是因为找不到DLL。确保正确的DLL集已复制到c:\windows\system32

总结在64位环境下的所有步骤:

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