Линкер GH C не может найти полугруппы - PullRequest
1 голос
/ 15 февраля 2020

Я пытаюсь скомпилировать проект Haskell на Windows с включенным профилированием, используя следующую команду.

ghc --make -O -prof -fprof-auto game_dangerous.hs

Я сам разрабатываю проект, и тот же исходный код скомпилирован и отлично связан без профилирования. Как и ожидалось (из предыдущего опыта), я столкнулся с рядом ошибок в форме:

Could not find module `Data.Vector.Mutable'
Perhaps you haven't installed the profiling libraries for package `vector-0.12.0.2'?

Я продолжал итеративно переустанавливать пакеты на основе ошибок, обнаруженных, например:

cabal install -p vector --reinstall

Кабал продолжал предупреждать меня о возможной поломке пакетов при переустановках, но я продолжал (насколько я мог видеть), что каждый пакет, который мог быть поврежден, собирался переустанавливаться сам, когда я перемещался по дереву зависимостей. Кроме того, я ранее следовал тому же процессу на другом компьютере, и он работал нормально. После переустановки всех необходимых пакетов мой проект теперь компилируется, но компоновщик не работает с этой ошибкой:

C://Program Files//Haskell Platform//8.6.3//mingw//bin/ld.exe: cannot find -lHSsemigroups-0.18.5-8pPnWqWrcWhEagTFf5Pnk2_p
collect2.exe: error: ld returned 1 exit status
`gcc.exe' failed in phase `Linker'. (Exit code: 1)

Однако сборка завершается успешно без включенного профилирования. Кто-нибудь знает, что могло пойти не так и как исправить проблему? Заранее спасибо.

Стивен

1 Ответ

1 голос
/ 17 февраля 2020

Я бы попробовал создать файл .cabal для вашей программы, где вы явно указываете пакеты cabal, от которых зависит ваша программа, и используете cabal v2-build для компиляции вашей программы. Он будет предупреждать вас об отсутствующих зависимостях вашей программы, пока вы не включите их все в раздел build-depends файла .cabal. Вам нужно только включить зависимости вашей программы, а не зависимости этих зависимостей. После этого вы можете добавить cabal.project.local, чтобы включить профилирование и, возможно, что-то еще. Этого должно быть достаточно для запуска cabal v2-build для сборки вашей программы и пакетов, от которых она зависит, с включенным профилированием (и другими параметрами в cabal.project.local).

В используемых пакетах необходимо включить профилирование вашей программой для поддержки профилирования в нем. Сборка Cabal v2 позволяет вам иметь несколько экземпляров одного и того же пакета. Эти экземпляры различны, потому что для их создания использовались разные флаги и опции.

Можно достичь того же результата, используя отдельную базу данных пакетов для вашей программы. То есть используется gh c -pkg с параметром --package-db.

Другой вариант - использовать стек. Он решит те же проблемы, но по-разному, за счет увеличения места и некоторых потерь производительности в gh c (по сравнению с gh c, созданным из источника, который может использоваться с cabal).

...