我一直试图在我的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机器上工作,所以如果有两种系统的解决方案,我会很感激。
谢谢!
发布于 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位环境):
# 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 build和stack exec glpktest这个例子。如果可执行文件生成正确,但运行时没有输出,则可能是因为未找到DLL。确保正确的DLL集已复制到c:\windows\system32中。
为了总结所有假设64位环境的步骤:
w64目录复制到c:\windows\system32w64目录中,将glpk_4_65.lib复制到glpk.lib。stack.yaml和解析器lts-12.26以及适当的目录设置。stack build (首先删除不必要的import行)与上面给出的executable子句复制到.cabal文件中(包括-threaded GHC选项)。stack exec glpktest,您将希望看到打印的解决方案(x1=40、x2=50和x3=0)。https://stackoverflow.com/questions/59911444
复制相似问题