Подтвердить что ты не робот

Невозможно скомпилировать проект haskell: не удалось выполнить этап привязки

У меня возникают проблемы с запуском моего проекта. Этот проект использовался для правильной работы, и я не совсем уверен, какие изменения нарушили его. Я думаю, что это связано с проблемами между GHC 7.6 и OSX Mavericks (я использую Дарин Моррисон, формулы доморощенного здесь). [ Изменить:, чтобы уточнить, это работало в один момент на Mavericks, поэтому эта гипотеза может не задерживаться.] Проблема, похоже, на этапе связывания:

In-place registering chorez-0.1.0.0...
Preprocessing executable 'chorez' for chorez-0.1.0.0...
Linking dist/build/chorez/chorez ...
Undefined symbols for architecture x86_64:
  "_chorezzzm0zi1zi0zi0_ChorezzziRequest_AddResponse_con_info", referenced from:
      _s5X4_info in libHSchorez-0.1.0.0.a(Commands.o)
  "_chorezzzm0zi1zi0zi0_ChorezzziRequest_ErrorResponse_static_info", referenced from:
      _chorezzzm0zi1zi0zi0_ChorezzziCommands_route1_closure in libHSchorez-0.1.0.0.a(Commands.o)
  "_chorezzzm0zi1zi0zi0_ChorezzziRequest_parseRequest_closure", referenced from:
      _r7eV_srt in libHSchorez-0.1.0.0.a(Server.o)
  "_chorezzzm0zi1zi0zi0_ChorezzziRequest_parseRequest_info", referenced from:
      _s7nh_info in libHSchorez-0.1.0.0.a(Server.o)
  "_chorezzzm0zi1zi0zi0_ChorezzziRequest_zdfToJSONResponse1_closure", referenced from:
      _r7eS_closure in libHSchorez-0.1.0.0.a(Server.o)
  "_chorezzzm0zi1zi0zi0_ChorezzziRequest_zdfToJSONResponse4_closure", referenced from:
      _s7ng_info in libHSchorez-0.1.0.0.a(Server.o)
      _r7eQ_closure in libHSchorez-0.1.0.0.a(Server.o)
      _r7eV_srt in libHSchorez-0.1.0.0.a(Server.o)
  "_chorezzzm0zi1zi0zi0_ChorezzziRequest_zdfToJSONResponse5_closure", referenced from:
      _s7ng_info in libHSchorez-0.1.0.0.a(Server.o)
      _r7eV_srt in libHSchorez-0.1.0.0.a(Server.o)
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status

Все эти символы взяты из моего собственного проекта (судя по именам). Большинство ответов, которые я видел об этом, связаны с тем, что некоторая библиотека не связывается должным образом. Я подозреваю, что некоторые из этих символов генерируются deriveToJSON из Data.Aeson.TH. Я переустановил пару раз без разрешения. Любые идеи?

4b9b3361

Ответ 1

Вот что окончательно зафиксировало это. Моя конфигурация cabal была примерно такой:

library
  exposed-modules:
      My.Module1
    , My.Module3


executable my-executable
  main-is:             Main.hs
  build-depends:
      base >=4.6 && <4.7
    , chorez

Main.hs для исполняемого импорта My.Module3. My.Module3 импортирует закрытый My.Module2. Включение My.Module2 под exposed-modules исправило проблему. Я понял это, потому что понял, что все символы, которые не могут быть найдены, пришли из этого модуля. cabal repl работал просто отлично (я тестировал модули вручную, и все они в основном работали), но cabal run этого не делал. Я чувствую, что должен иметь возможность использовать библиотеку с частными модулями в исполняемом файле, но в этом случае я просто забыл добавить новый модуль в список, и у меня нет причин делать какой-либо модуль приватным, поэтому я и бежать пока.

Ответ 2

Немного поздно для вечеринки, но вы хотите разместить свои незакрытые модули в разделе other-modules.

Из Руководство пользователя Cabal:

Модули, входящие в комплект

Для библиотеки cabal init ищет в каталоге проекта файлы, которые выглядят как модули Haskell, и добавляет все модули в поле exposed-modules. Для модулей, которые не являются частью общего интерфейса вашего пакета, вы можете переместить эти модули в поле other-modules. В любом случае все модули в библиотеке должны быть перечислены.

Ответ 3

Удалить и переустановить - не GHC, а Xcode. Это решило проблему для меня.