首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >安装glpk-hs

安装glpk-hs
EN

Stack Overflow用户
提问于 2020-01-25 16:59:13
回答 1查看 215关注 0票数 3

我一直试图在我的Haskell项目中使用glpk,但我完全不知道该如何做。我正在使用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

我还尝试通过下载可执行文件并将其添加到路径中来安装glpk for Windows,当我在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机器上工作,所以如果有两种系统的解决方案,我会很感激。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-25 19:47:09

glpk-hs包为单独安装的 GLPK库提供了GHC接口,但是安装glpk-hs并不会自动安装所需的库。编译包的"glpk.c"文件不会有帮助,因为这只是一些帮助构建接口的存根C代码。(大多数为其他库提供“桥梁”的GHC包都是这样设计的,因此glpk-hs不是特例。)

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

在Windows下,我想从用于Windows项目页面的GLPK下载带有预编译二进制文件的with文件可能是最简单的。将其解压到方便的地方,并按照该网页上的说明,酌情将32位或64位DLL复制到c:\windows\system32目录中。

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

代码语言:javascript
复制
# 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时,我遇到了另一个问题,所以我不得不复制库。我不确定是否有更好的方法。

代码语言:javascript
复制
> 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解析器为我工作:

代码语言:javascript
复制
# in stack.yaml
resolver: lts-12.26

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

代码语言:javascript
复制
-- 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子句:

代码语言:javascript
复制
-- 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

代码语言:javascript
复制
-- 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 (首先删除不必要的import行)与上面给出的executable子句复制到.cabal文件中(包括-threaded GHC选项)。
  6. 使用stack exec glpktest,您将希望看到打印的解决方案(x1=40、x2=50和x3=0)。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59911444

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档