Пакет glpk-hs
предоставляет интерфейс GH C для отдельно установленной библиотеки GLPK, но при установке glpk-hs
эта необходимая библиотека автоматически не устанавливается. Компиляция файла "glpk.c"
пакета не поможет, так как это всего лишь некоторый код заглушки C, помогающий в создании интерфейса. (Подавляющее большинство пакетов GH C, которые предоставляют «мост» к другим библиотекам, спроектированы таким образом, поэтому glpk-hs
не является особым случаем.)
При Linux вам потребуется чтобы установить версию разработки пакета GLPK «обычным» способом, используя менеджер пакетов вашего дистрибутива (например, для дистрибутивов на основе Debian, вам нужно будет запустить apt install libglpk-dev
), прежде чем пытаться (повторно) установить glpk-hs
package.
В Windows я думаю, что, вероятно, проще всего скачать zip-файл с предварительно скомпилированными двоичными файлами из GLPK для Windows Project Page . Распакуйте его в удобное для вас место и, следуя инструкциям на этой веб-странице, скопируйте 32-битные или 64-битные библиотеки DLL, в зависимости от ситуации, в каталог c:\windows\system32
.
Чтобы stack
построить против библиотеки, она должна иметь некоторую дополнительную библиотеку и указывать каталоги файлов. В вашем проекте c 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
не совместим с текущей версией GH C 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-битной среде:
- Загрузите и распакуйте предварительно скомпилированный двоичные файлы из проекта winglpk
- Скопируйте библиотеки DLL из каталога
w64
в c:\windows\system32
- В каталоге
w64
скопируйте glpk_4_65.lib
в glpk.lib
. - Используйте
stack.yaml
выше с распознавателем lts-12.26
и соответствующими настройками каталога. - Попробуйте
stack build
Example1.hs
, указанный выше (сначала удалите ненужную строку import
) с executable
Вышеуказанное условие скопировано в ваш файл .cabal
(включая параметр -threaded
GH C) - Используйте
stack exec glpktest
, и вы, вероятно, увидите напечатанное решение (x1 = 40, x2 = 50 и x3 = 0).