该软件包为单独安装的GLPK 库glpk-hs
提供了 GHC 接口,但安装不会自动安装所需的库。编译包的文件无济于事,因为那只是一些有助于构建接口的存根 C 代码。(绝大多数为其他库提供“桥梁”的 GHC 包都是这样设计的,所以不是特例。)glpk-hs
"glpk.c"
glpk-hs
apt install libglpk-dev
在 Linux 下,在尝试(重新)安装之前,您需要使用发行版的包管理器以“通常”的方式安装 GLPK 包的开发版本(例如,对于基于 Debian 的发行版,您需要运行)glpk-hs
包裹。
在 Windows 下,我想从GLPK for Windows Project Page下载带有预编译二进制文件的 zipfile 可能是最简单的。将其解压缩到方便的地方,然后根据该网页上的说明,将 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
软件包与当前的 GHCcontainers
版本不兼容,因此您需要在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 位环境的所有步骤:
- 从winglpk项目下载并解压预编译的二进制文件
- 将 DLL 从
w64
目录复制到c:\windows\system32
- 在
w64
目录中,复制glpk_4_65.lib
到glpk.lib
.
- 将
stack.yaml
上述内容与解析器lts-12.26
和适当的目录设置一起使用。
- 将上面给出的子句复制到您的文件中(包括GHC 选项) ,尝试上面
stack build
的Example1.hs
链接(首先删除不必要的import
行)executable
.cabal
-threaded
- 使用
stack exec glpktest
,您会希望看到打印的解决方案(x1=40、x2=50 和 x3=0)。