#haskell #ghc #ghci #wxhaskell
#haskell #ghc #ghci #wxhaskell
Вопрос:
Я пытаюсь создать HelloWorld.exe в Windows 7 это демонстрирует очень простую программу wxHaskell, которую я нашел в Интернете. Код приведен ниже:
module HelloWorldWX where
import Graphics.UI.WX
main :: IO ()
main
= start hello
hello :: IO ()
hello = do
f <- frame [text := "Hello!"]
quit <- button f [text := "Quit", on command := close f]
set f [layout := widget quit]
в файле с именем HelloWorldWX.hs. Я загрузил двоичный дистрибутив wxHaskell (wxInstall-Achelanne-64-0.1). После запуска Install.bat я заметил, что он использовал Cabal для настройки нового расположения пакета, в котором он установил wx-0.92.0.1 и все его функции. При первом запуске произошел сбой по какой-то неуказанной причине. Я запустил ghc-pkg list
и обнаружил, что все пакеты были перечислены в новом расположении пакета cabal. Я решил отменить регистрацию всех пакетов и повторить попытку. Во второй раз это было успешно и побудило меня включить следующие каталоги в мой путь поиска, что я и сделал:
C:Users …Downloads wxInstall-Achelanne-64-0.1 DLL;C:Users …Downloads wxInstall-Achelanne-64-0.1 wxWidgets lib gcc_dll
На данный момент, когда я загрузил HelloWorldWX.hs в GHCI и запустил main, я получил рамку окна с кнопкой выхода, как я и ожидал.
Затем я скомпилировал файл .hs в файл .o. Затем я попытался создать исполняемый файл с помощью следующей команды:
ghc -v -o HelloWorldWX HelloWorldWX.o
Glasgow Haskell Compiler, Version 7.10.3, stage 2 booted by GHC version 7.10.2
Using binary package database: C:Users...Haskell Platform7.10.3libpack
age.conf.dpackage.cache
Using binary package database: C:Users...AppDataRoamingghcx86_64-mingw
32-7.10.3package.conf.dpackage.cache
wired-in package ghc-prim mapped to ghc-prim-0.4.0.0-428c198583a031a3ea42dd32ae6
f9bab
wired-in package integer-gmp mapped to integer-gmp-1.0.0.0-3c8c40657a9870f5c33be
17496806d8d
wired-in package base mapped to base-4.8.2.0-14035a44a8b95c6832da6dae1420f59e
wired-in package rts mapped to builtin_rts
wired-in package template-haskell mapped to template-haskell-2.10.0.0-bcb07fec12
f32563bb45d7fb009640b1
wired-in package ghc mapped to ghc-7.10.3-7a0d3c701e4b1d1f2c3f3bd2deae9bed
wired-in package dph-seq not found.
wired-in package dph-par not found.
Hsc static flags:
Created temporary directory: C:Users...AppDataLocalTemp1ghc13152_0
*** C Compiler:
"C:Users...Haskell Platform7.10.3lib/../mingw/bin/gcc.exe" "-fno-stack-
protector" "-DTABLES_NEXT_TO_CODE" "-c" "C:Users...AppDataLocalTemp1g
hc13152_0ghc_1.c" "-o" "C:Users...AppDataLocalTemp1ghc13152_0ghc_2.
o" "-IC:Users...Haskell Platform7.10.3lib/include"
*** Windres:
"C:Users...Haskell Platform7.10.3lib/../mingw/bin/windres.exe" "--prepr
ocessor="C:Users...Haskell Platform7.10.3lib/../mingw/bin/gcc.exe" "
-fno-stack-protector" "-DTABLES_NEXT_TO_CODE" "-E" "-xc" "-DRC_INVOKED"
" "--use-temp-file" "--input=C:Users...AppDataLocalTemp1ghc13152_0gh
c_4.rc" "--output=C:Users...AppDataLocalTemp1ghc13152_0ghc_5.o" "--o
utput-format=coff"
*** Linker:
"C:Users...Haskell Platform7.10.3lib/../mingw/bin/gcc.exe" "-fno-stack-
protector" "-DTABLES_NEXT_TO_CODE" "-Wl,--hash-size=31" "-Wl,--reduce-memory-ove
rheads" "-Xlinker" "--stack=0x800000,0x800000" "-static-libgcc" "-o" "HelloWorld
WX.exe" "-Wl,--enable-auto-import" "HelloWorldWX.o" "C:Users...AppDataLo
calTemp1ghc13152_0ghc_5.o" "-LC:Users...Haskell Platform7.10.3libb
ase_HQfYBxpPvuw8OunzQu6JGM" "-LC:Users...Haskell Platform7.10.3libinte
g_2aU3IZNMF9a7mQ0OzsZ0dS" "-LC:Users...Haskell Platform7.10.3libghcpr_
8TmvWUcS1U1IKHT0levwg3" "-LC:Users...Haskell Platform7.10.3lib/rts" "C:
Users...AppDataLocalTemp1ghc13152_0ghc_2.o" "-Wl,-u,ghczmprim_GHCziT
ypes_Izh_static_info" "-Wl,-u,ghczmprim_GHCziTypes_Czh_static_info" "-Wl,-u,ghcz
mprim_GHCziTypes_Fzh_static_info" "-Wl,-u,ghczmprim_GHCziTypes_Dzh_static_info"
"-Wl,-u,base_GHCziPtr_Ptr_static_info" "-Wl,-u,ghczmprim_GHCziTypes_Wzh_static_i
nfo" "-Wl,-u,base_GHCziInt_I8zh_static_info" "-Wl,-u,base_GHCziInt_I16zh_static_
info" "-Wl,-u,base_GHCziInt_I32zh_static_info" "-Wl,-u,base_GHCziInt_I64zh_stati
c_info" "-Wl,-u,base_GHCziWord_W8zh_static_info" "-Wl,-u,base_GHCziWord_W16zh_st
atic_info" "-Wl,-u,base_GHCziWord_W32zh_static_info" "-Wl,-u,base_GHCziWord_W64z
h_static_info" "-Wl,-u,base_GHCziStable_StablePtr_static_info" "-Wl,-u,ghczmprim
_GHCziTypes_Izh_con_info" "-Wl,-u,ghczmprim_GHCziTypes_Czh_con_info" "-Wl,-u,ghc
zmprim_GHCziTypes_Fzh_con_info" "-Wl,-u,ghczmprim_GHCziTypes_Dzh_con_info" "-Wl,
-u,base_GHCziPtr_Ptr_con_info" "-Wl,-u,base_GHCziPtr_FunPtr_con_info" "-Wl,-u,ba
se_GHCziStable_StablePtr_con_info" "-Wl,-u,ghczmprim_GHCziTypes_False_closure" "
-Wl,-u,ghczmprim_GHCziTypes_True_closure" "-Wl,-u,base_GHCziPack_unpackCString_c
losure" "-Wl,-u,base_GHCziIOziException_stackOverflow_closure" "-Wl,-u,base_GHCz
iIOziException_heapOverflow_closure" "-Wl,-u,base_ControlziExceptionziBase_nonTe
rmination_closure" "-Wl,-u,base_GHCziIOziException_blockedIndefinitelyOnMVar_clo
sure" "-Wl,-u,base_GHCziIOziException_blockedIndefinitelyOnSTM_closure" "-Wl,-u,
base_GHCziIOziException_allocationLimitExceeded_closure" "-Wl,-u,base_ControlziE
xceptionziBase_nestedAtomically_closure" "-Wl,-u,base_GHCziEventziThread_blocked
OnBadFD_closure" "-Wl,-u,base_GHCziWeak_runFinalizzerBatch_closure" "-Wl,-u,base
_GHCziTopHandler_flushStdHandles_closure" "-Wl,-u,base_GHCziTopHandler_runIO_clo
sure" "-Wl,-u,base_GHCziTopHandler_runNonIO_closure" "-Wl,-u,base_GHCziConcziIO_
ensureIOManagerIsRunning_closure" "-Wl,-u,base_GHCziConcziIO_ioManagerCapabiliti
esChanged_closure" "-Wl,-u,base_GHCziConcziSync_runSparks_closure" "-Wl,-u,base_
GHCziConcziSignal_runHandlersPtr_closure" "-lHSbase-4.8.2.0-HQfYBxpPvuw8OunzQu6J
GM" "-lHSinteger-gmp-1.0.0.0-2aU3IZNMF9a7mQ0OzsZ0dS" "-lHSghc-prim-0.4.0.0-8TmvW
UcS1U1IKHT0levwg3" "-lHSrts" "-lCffi-6" "-lwsock32" "-luser32" "-lshell32" "-lm"
"-lwsock32" "-lgdi32" "-lwinmm"
HelloWorldWX.o:fake:(.text 0x35): undefined reference to `wxcorzuLc8buVrXMQOAAoN
jm2eSy1_GraphicsziUIziWXCoreziLayout_zdfWidgetObject_closure'
HelloWorldWX.o:fake:(.text 0x91): undefined reference to `wxzu6QQu5v1wfyA22ZZSle
eGHgzz_GraphicsziUIziWXziAttributes_ZCze_con_info'
HelloWorldWX.o:fake:(.text 0x9a): undefined reference to `wxzu6QQu5v1wfyA22ZZSle
eGHgzz_GraphicsziUIziWXziTopLevelWindow_zdfFormObject_closure'
HelloWorldWX.o:fake:(.text 0xca): undefined reference to `wxzu6QQu5v1wfyA22ZZSle
eGHgzz_GraphicsziUIziWXziAttributes_set_closure'
HelloWorldWX.o:fake:(.text 0x11d): undefined reference to `wxzu6QQu5v1wfyA22ZZSl
eeGHgzz_GraphicsziUIziWXziTopLevelWindow_zdfCloseableObject_closure'
HelloWorldWX.o:fake:(.text 0x15f): undefined reference to `wxzu6QQu5v1wfyA22ZZSl
eeGHgzz_GraphicsziUIziWXziControls_zdfCommandingObject4_closure'
HelloWorldWX.o:fake:(.text 0x164): undefined reference to `wxzu6QQu5v1wfyA22ZZSl
eeGHgzz_GraphicsziUIziWXziEvents_on_closure'
HelloWorldWX.o:fake:(.text 0x1ef): undefined reference to `wxzu6QQu5v1wfyA22ZZSl
eeGHgzz_GraphicsziUIziWXziWindow_zdfTextualObject_closure'
HelloWorldWX.o:fake:(.text 0x27e): undefined reference to `wxzu6QQu5v1wfyA22ZZSl
eeGHgzz_GraphicsziUIziWXziAttributes_ZCze_con_info'
HelloWorldWX.o:fake:(.text 0x2ce): undefined reference to `wxzu6QQu5v1wfyA22ZZSl
eeGHgzz_GraphicsziUIziWXziAttributes_ZCze_con_info'
HelloWorldWX.o:fake:(.text 0x2ff): undefined reference to `wxzu6QQu5v1wfyA22ZZSl
eeGHgzz_GraphicsziUIziWXziControls_button_closure'
HelloWorldWX.o:fake:(.text 0x427): undefined reference to `wxzu6QQu5v1wfyA22ZZSl
eeGHgzz_GraphicsziUIziWXziWindow_zdfTextualObject_closure'
HelloWorldWX.o:fake:(.text 0x4b9): undefined reference to `wxzu6QQu5v1wfyA22ZZSl
eeGHgzz_GraphicsziUIziWXziAttributes_ZCze_con_info'
HelloWorldWX.o:fake:(.text 0x4eb): undefined reference to `wxzu6QQu5v1wfyA22ZZSl
eeGHgzz_GraphicsziUIziWXziFrame_frame_closure'
HelloWorldWX.o:fake:(.text 0x5da): undefined reference to `wxzu6QQu5v1wfyA22ZZSl
eeGHgzz_GraphicsziUIziWX_start_closure'
HelloWorldWX.o:fake:(.text 0x1f8): undefined reference to `wxzu6QQu5v1wfyA22ZZSl
eeGHgzz_GraphicsziUIziWXziClasses_text_info'
HelloWorldWX.o:fake:(.text 0x430): undefined reference to `wxzu6QQu5v1wfyA22ZZSl
eeGHgzz_GraphicsziUIziWXziClasses_text_info'
HelloWorldWX.o:fake:(.data 0x70): undefined reference to `wxcorzuLc8buVrXMQOAAoN
jm2eSy1_GraphicsziUIziWXCoreziLayout_zdfWidgetObject_closure'
HelloWorldWX.o:fake:(.data 0x78): undefined reference to `wxzu6QQu5v1wfyA22ZZSle
eGHgzz_GraphicsziUIziWXziAttributes_set_closure'
HelloWorldWX.o:fake:(.data 0x80): undefined reference to `wxzu6QQu5v1wfyA22ZZSle
eGHgzz_GraphicsziUIziWXziTopLevelWindow_zdfFormObject_closure'
HelloWorldWX.o:fake:(.data 0x88): undefined reference to `wxzu6QQu5v1wfyA22ZZSle
eGHgzz_GraphicsziUIziWXziTopLevelWindow_zdfCloseableObject_closure'
HelloWorldWX.o:fake:(.data 0x90): undefined reference to `wxzu6QQu5v1wfyA22ZZSle
eGHgzz_GraphicsziUIziWXziEvents_on_closure'
HelloWorldWX.o:fake:(.data 0x98): undefined reference to `wxzu6QQu5v1wfyA22ZZSle
eGHgzz_GraphicsziUIziWXziControls_zdfCommandingObject4_closure'
HelloWorldWX.o:fake:(.data 0xa8): undefined reference to `wxzu6QQu5v1wfyA22ZZSle
eGHgzz_GraphicsziUIziWXziWindow_zdfTextualObject_closure'
HelloWorldWX.o:fake:(.data 0xb0): undefined reference to `wxzu6QQu5v1wfyA22ZZSle
eGHgzz_GraphicsziUIziWXziControls_button_closure'
HelloWorldWX.o:fake:(.data 0xc8): undefined reference to `wxzu6QQu5v1wfyA22ZZSle
eGHgzz_GraphicsziUIziWXziFrame_frame_closure'
HelloWorldWX.o:fake:(.data 0xd8): undefined reference to `wxzu6QQu5v1wfyA22ZZSle
eGHgzz_GraphicsziUIziWX_start_closure'
C:Users...AppDataLocalTemp1ghc13152_0ghc_2.o:ghc_1.c:(.rdata$.refptr
.ZCMain_main_closure[.refptr.ZCMain_main_closure] 0x0): undefined reference to `
ZCMain_main_closure'
collect2.exe: error: ld returned 1 exit status
*** Deleting temp files:
Deleting: C:Users...AppDataLocalTemp1ghc13152_0ghc_6.rsp C:Userspp
77316AppDataLocalTemp1ghc13152_0ghc_5.o C:Users...AppDataLocalTem
p1ghc13152_0ghc_4.rc C:Users...AppDataLocalTemp1ghc13152_0ghc_3.r
sp C:Users...AppDataLocalTemp1ghc13152_0ghc_2.o C:Users...App
DataLocalTemp1ghc13152_0ghc_1.c
*** Deleting temp dirs:
Deleting: C:Users...AppDataLocalTemp1ghc13152_0
Я не совсем уверен, почему у него возникают проблемы с поиском этих ссылок.
Я попытался выполнить тогда с
запустите haskell HelloWorldWX.hs
и получил следующее всплывающее окно с ошибкой от ghc:
Установленный здесь флаг Verbose предоставляет кучу информации, которая на самом деле не описывает какие-либо конкретные проблемы.
Я запускаю полный пакет Haskell GHC 7.10.3 из установщика Windows в каталог локальных пользователей. У меня нет прав локального администратора на этой рабочей станции, но я мог бы попробовать на другой машине.
Какие-либо подсказки? Я полагаю, что первая неудачная установка wxHaskell что-то повредила, или я столкнулся с проблемой привилегий.
Комментарии:
1.
undefined reference
обычно это означает, что компоновщик не имеет доступа к соответствующим библиотекам. В вашем вызове компоновщика, вероятно, отсутствует что-то вроде-lC:Users...DownloadswxInstall-Achelanne-64-0.1wxWidgetslibgcc_dll
— прямой запрос на использование вашейwxWidgets
библиотеки во время компоновки (подробнее о компоновке здесь: downloads.haskell.org /~ghc/7.6.1/docs/html/users_guide/… )2. @TomaszLewowski Я подумал, что достаточно просто указать эту папку в пути поиска. Возможно, нет.
3. @TomaszLewowski Независимо от того, я попробовал то, что вы предлагаете, и я получаю те же ошибки. Я подтверждаю в подробном выводе, что опция -L включена в выполнение gcc для связывания. Все, что он ищет, отсутствует в этих библиотеках
4. @TomaszLewowski Спасибо за ваше руководство. Я разобрался с проблемой. Смотрите мой ответ ниже.
Ответ №1:
Я понял, в чем проблема. Я забыл, что для GHC для создания исполняемого файла вам необходимо явно указать пакеты Cabal, которые вы хотите включить. Комментатор Томаш Левовски был частично прав. Опция -L для связывания библиотек требовалась gcc, однако приложение ghc разумно добавляет ВСЕ необходимые пути к библиотекам для данного пакета Cabal, используя эту -package
опцию.
Вторая часть выполнения этой работы заключалась в том, что мне нужно было скомпилировать файл .o с указанием -main-is для метода main . Я написал простой пакетный файл и заставил его работать.
ghc -v -main-is HelloWorld.main HelloWorld.hs
ghc -v -o HelloWorld HelloWorld.o -package strict-0.3.2 -package wx-0.92.2.0 -package wxc-0.92.2.0 -package wxcore-0.92.2.0 -package wxdirect-0.92.2.0
Это создало исполняемый файл Windows просто отлично, и он работает как шарм.