Не удалось запустить программу wxHaskell, которая работает в GHCI

Я пытаюсь создать 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 и обнаружил, что все пакеты перечислены в новом расположении пакетов клики. Я решил отменить регистрацию всех пакетов и попробовать еще раз. Во второй раз это было успешно и побудило меня включить следующие каталоги в мой путь поиска, что я и сделал:

C:\Users...\Downloads\wxInstall-Achelanne-64-0.1\DLLs;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 Platform\7.10.3\lib\pack
age.conf.d\package.cache
Using binary package database: C:\Users\...\AppData\Roaming\ghc\x86_64-mingw
32-7.10.3\package.conf.d\package.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\...\AppData\Local\Temp\1\ghc13152_0
*** C Compiler:
"C:\Users\...\Haskell Platform\7.10.3\lib/../mingw/bin/gcc.exe" "-fno-stack-
protector" "-DTABLES_NEXT_TO_CODE" "-c" "C:\Users\...\AppData\Local\Temp\1\g
hc13152_0\ghc_1.c" "-o" "C:\Users\...\AppData\Local\Temp\1\ghc13152_0\ghc_2.
o" "-IC:\Users\...\Haskell Platform\7.10.3\lib/include"
*** Windres:
"C:\Users\...\Haskell Platform\7.10.3\lib/../mingw/bin/windres.exe" "--prepr
ocessor=\"C:\Users\...\Haskell Platform\7.10.3\lib/../mingw/bin/gcc.exe\" \"
-fno-stack-protector\" \"-DTABLES_NEXT_TO_CODE\" \"-E\" \"-xc\" \"-DRC_INVOKED\"
" "--use-temp-file" "--input=C:\Users\...\AppData\Local\Temp\1\ghc13152_0\gh
c_4.rc" "--output=C:\Users\...\AppData\Local\Temp\1\ghc13152_0\ghc_5.o" "--o
utput-format=coff"
*** Linker:
"C:\Users\...\Haskell Platform\7.10.3\lib/../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\...\AppData\Lo
cal\Temp\1\ghc13152_0\ghc_5.o" "-LC:\Users\...\Haskell Platform\7.10.3\lib\b
ase_HQfYBxpPvuw8OunzQu6JGM" "-LC:\Users\...\Haskell Platform\7.10.3\lib\inte
g_2aU3IZNMF9a7mQ0OzsZ0dS" "-LC:\Users\...\Haskell Platform\7.10.3\lib\ghcpr_
8TmvWUcS1U1IKHT0levwg3" "-LC:\Users\...\Haskell Platform\7.10.3\lib/rts" "C:
\Users\...\AppData\Local\Temp\1\ghc13152_0\ghc_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\...\AppData\Local\Temp\1\ghc13152_0\ghc_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\...\AppData\Local\Temp\1\ghc13152_0\ghc_6.rsp C:\Users\pp
77316\AppData\Local\Temp\1\ghc13152_0\ghc_5.o C:\Users\...\AppData\Local\Tem
p\1\ghc13152_0\ghc_4.rc C:\Users\...\AppData\Local\Temp\1\ghc13152_0\ghc_3.r
sp C:\Users\...\AppData\Local\Temp\1\ghc13152_0\ghc_2.o C:\Users\...\App
Data\Local\Temp\1\ghc13152_0\ghc_1.c
*** Deleting temp dirs:
Deleting: C:\Users\...\AppData\Local\Temp\1\ghc13152_0

Я не совсем уверен, почему у него проблемы с поиском этих ссылок.

Я попытался выполнить тогда с

runhaskell HelloWorldWX.hs

и получил следующее всплывающее окно с ошибкой от ghc:

введите описание изображения здесь

Установленный здесь флаг Verbose дает кучу информации, которая на самом деле не раскрывает какие-либо конкретные проблемы.

Я запускаю полный пакет Haskell GHC 7.10.3 из установщика Windows в локальный каталог пользователей. У меня нет прав локального администратора на этой рабочей станции, но я могу попробовать на другой машине.

Любые подсказки? Я предполагаю, что первая неудачная установка wxHaskell что-то испортила, или я столкнулся с проблемой привилегий.


person maple_shaft    schedule 11.10.2016    source источник
comment
undefined reference обычно означает, что компоновщик не имеет доступа к нужным библиотекам. В вашем вызове компоновщика, вероятно, отсутствует что-то вроде -lC:\Users...\Downloads\wxInstall-Achelanne-64-0.1\wxWidgets\lib\gcc_dll — прямой запрос на использование вашей библиотеки wxWidgets во время компоновки (более подробная информация о компоновке приведена здесь: downloads.haskell.org/~ghc/7.6.1/docs/html/users_guide/)   -  person Tomasz Lewowski    schedule 13.10.2016
comment
@TomaszLewowski Я думал, что достаточно просто иметь эту папку в пути поиска. Возможно нет.   -  person maple_shaft    schedule 13.10.2016
comment
@TomaszLewowski Несмотря на это, я пробовал то, что вы предлагаете, и получаю те же ошибки. Я подтверждаю в подробном выводе, что параметр -L включен в выполнение gcc для связывания. Что бы он ни искал, его нет в этих библиотеках.   -  person maple_shaft    schedule 13.10.2016
comment
@TomaszLewowski Спасибо за ваше руководство. Я понял проблему. Смотрите мой ответ ниже.   -  person maple_shaft    schedule 13.10.2016


Ответы (1)


Я понял, в чем проблема. Я забыл, что для создания исполняемого файла GHC необходимо явно указать пакеты Cabal, которые вы хотите включить. Комментатор Томаш Левовски был частично прав. Параметр -L для связывания библиотек был необходим gcc, однако приложение ghc интеллектуально добавляет ВСЕ необходимые пути библиотек для данного пакета Cabal с помощью параметра -package.

Вторая часть этой работы заключалась в том, что мне нужно было скомпилировать файл .o, указав -main-is для основного метода. Я написал простой пакетный файл, и он заработал.

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 просто отлично, и он работает как шарм.

person maple_shaft    schedule 13.10.2016