我一直在尝试在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机器上工作,因此,如果有的话,我希望能对两个系统都适用的解决方案。
谢谢!
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 build
和stack exec glpktest
该示例。如果可执行文件正确生成,但运行却未产生任何输出,则可能是因为找不到DLL。确保正确的DLL集已复制到c:\windows\system32
。
总结在64位环境下的所有步骤:
w64
目录复制到c:\windows\system32
w64
目录中,将glpk_4_65.lib
复制到glpk.lib
。stack.yaml
与解析器lts-12.26
和适当的目录设置一起使用。stack build
子句复制到您的Example1.hs
文件(包括import
GHC选项中),将上面链接的executable
链接(首先删除不必要的.cabal
行)-threaded
,希望您能看到打印的解决方案(x1 = 40,x2 = 50和x3 = 0)。