Установка glpk-hs - PullRequest
       70

Установка glpk-hs

3 голосов
/ 25 января 2020

Я пытался использовать glpk-hs в моем Haskell проекте, но я совершенно потерян, как это сделать. Я использую stack для запуска своей программы, и моя путаница, скорее всего, связана с недостатком знаний о том, как она работает.

При этом я скачал glpk-hs-0.7 и поместил извлеченную папку в папку моего проекта. Я запускаю свой код с stack ghci my_program.hs, со следующими зависимостями от stack.yaml файла:

"extra-deps: - gasp-1.2.0.0 - glpk-hs-0.7"

Он успешно устанавливает g asp но не удается установить glpk с этой ошибкой: glpk-hs > * Missing (or bad) C library: glpk.
Я также попытался установить glpk для Windows, загрузив исполняемые файлы и добавив его в PATH, и когда я запускаю glpsol на cmd, он выдает следующее сообщение:

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, поэтому я был бы признателен за решение, которое работает для обеих систем, если оно есть.

Спасибо!

1 Ответ

2 голосов
/ 25 января 2020

Пакет 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-битной среде:

  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 Example1.hs, указанный выше (сначала удалите ненужную строку import) с executable Вышеуказанное условие скопировано в ваш файл .cabal (включая параметр -threaded GH C)
  6. Используйте stack exec glpktest, и вы, вероятно, увидите напечатанное решение (x1 = 40, x2 = 50 и x3 = 0).
...