Невозможно скомпилировать проект 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
. Я переустановил пару раз без разрешения. Любые идеи?
Ответы
Ответ 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. Это решило проблему для меня.