Как распространять приложения wxHaskell?

Я использую GHC 7.6.3. Я установил wxHaskell отсюда: https://github.com/wxHaskell/wxHaskell

Это сработало, примеры программ скомпилированы и успешно запущены.

Единственная проблема сейчас заключается в том, что я хочу распространять приложение wxHaskell на Mac OS X. Я попытался использовать macosx-app и cabal-macosx ( https://github.com/michaelt/cabal-macosx), чтобы создать файл "app", Он отлично работает на моей машине, но не может работать на другом компьютере. Я получаю следующую ошибку:

Dyld Error Message: Library not loaded: /Users/user/.cabal/lib/wxc-0.90.1.0/ghc-7.6.3/libwxc.dylib.

Я использую OS X 10.8.4 (Mountain Lion), но мне было бы интересно также компилировать приложения для Windows и распространять их тоже.

Как лучше всего распространять приложения wxHaskell?

Setup.hs

-- Example Setup.hs for the wxHello app.

import Distribution.MacOSX
import Distribution.Simple

main :: IO ()
main = defaultMainWithHooks $ simpleUserHooks {
         postBuild = appBundleBuildHook guiApps -- no-op if not MacOS X
       }

guiApps :: [MacApp]
guiApps = [MacApp "WxHello"
                  (Just "resources/WxHello.icns")
                  Nothing -- Build a default Info.plist for the icon.
                  [] -- No other resources.
                  [] -- No other binaries.
                  ChaseWithDefaults -- Try changing to ChaseWithDefaults
          ]

wxHello.cabal:

Name:                   wxHello
Version:                0.1.0
Stability:              Alpha
Synopsis:               wxWidgets `Hello World' example for cabal-macosx
Description:
    Example showing how to use cabal-macosx to build an application
    bundle for a simple `Hello World' program using the wxWidgets GUI
    toolkit.
Category:               Data
License:                BSD3
License-file:           LICENSE
Copyright:              Andy Gimblett <haskell@gimbo.org.uk>
Author:                 Andy Gimblett <haskell@gimbo.org.uk>
Maintainer:             Andy Gimblett <haskell@gimbo.org.uk>
Build-Type:             Custom
Cabal-Version:          >=1.6

Executable WxHello
  hs-source-dirs:       src
  Main-is:              Main.hs
  Build-Depends:        base >= 3 && < 5, cabal-macosx, wx
  ghc-options:          -fwarn-tabs -threaded -Wall

Вот файлы dylib внутри сгенерированного пакета:

WxHello.app $ find . | grep dylib
./Contents/Frameworks/Users/user/.cabal/lib/wxc-0.90.1.0/ghc-7.6.3/libwxc.dylib
./Contents/Frameworks/Users/user/temp/wxWidgets-2.9.5/build-release/lib/libwx_baseu-2.9.5.0.0.dylib
./Contents/Frameworks/Users/user/temp/wxWidgets-2.9.5/build-release/lib/libwx_baseu_net-2.9.5.0.0.dylib
./Contents/Frameworks/Users/user/temp/wxWidgets-2.9.5/build-release/lib/libwx_baseu_xml-2.9.5.0.0.dylib
./Contents/Frameworks/Users/user/temp/wxWidgets-2.9.5/build-release/lib/libwx_osx_cocoau_adv-2.9.5.0.0.dylib
./Contents/Frameworks/Users/user/temp/wxWidgets-2.9.5/build-release/lib/libwx_osx_cocoau_aui-2.9.5.0.0.dylib
./Contents/Frameworks/Users/user/temp/wxWidgets-2.9.5/build-release/lib/libwx_osx_cocoau_core-2.9.5.0.0.dylib
./Contents/Frameworks/Users/user/temp/wxWidgets-2.9.5/build-release/lib/libwx_osx_cocoau_gl-2.9.5.0.0.dylib
./Contents/Frameworks/Users/user/temp/wxWidgets-2.9.5/build-release/lib/libwx_osx_cocoau_html-2.9.5.0.0.dylib
./Contents/Frameworks/Users/user/temp/wxWidgets-2.9.5/build-release/lib/libwx_osx_cocoau_propgrid-2.9.5.0.0.dylib
./Contents/Frameworks/Users/user/temp/wxWidgets-2.9.5/build-release/lib/libwx_osx_cocoau_qa-2.9.5.0.0.dylib
./Contents/Frameworks/Users/user/temp/wxWidgets-2.9.5/build-release/lib/libwx_osx_cocoau_ribbon-2.9.5.0.0.dylib
./Contents/Frameworks/Users/user/temp/wxWidgets-2.9.5/build-release/lib/libwx_osx_cocoau_richtext-2.9.5.0.0.dylib
./Contents/Frameworks/Users/user/temp/wxWidgets-2.9.5/build-release/lib/libwx_osx_cocoau_stc-2.9.5.0.0.dylib
./Contents/Frameworks/Users/user/temp/wxWidgets-2.9.5/build-release/lib/libwx_osx_cocoau_webview-2.9.5.0.0.dylib
./Contents/Frameworks/Users/user/temp/wxWidgets-2.9.5/build-release/lib/libwx_osx_cocoau_xrc-2.9.5.0.0.dylib
./Contents/Frameworks/usr/lib/libc++abi.dylib
./Contents/Frameworks/usr/lib/libexpat.1.dylib
./Contents/Frameworks/usr/lib/libiconv.2.dylib
./Contents/Frameworks/usr/lib/libstdc++.6.dylib
./Contents/Frameworks/usr/lib/libz.1.dylib

2 ответа

Последнему распространяемому мной в Windows с помощью wxHaskell нужны были файлы

  • mingwm10.dll а также
  • wxmws28u_gcc.dll

находиться в той же папке, что и.exe (а не только где-то на моем пути).

При этом использовалась предыдущая версия wxHaskell, скомпилированная с предыдущей версией самого wxWidgits, поэтому, вероятно, вам потребуется wx dll, чтобы в ней было 29, а не 28.

Я тоже скомпилировал со статической связью:

ghc -static -optl-static -optl-mwindows Main -o Project.exe

-optl-mwindows избавляется от окна командной строки, которое в противном случае появилось бы рядом с вашим приложением.

Может быть полезно включить ваши файлы.cabal и Setup.hs.

Из документации по cabal-macosx кажется, что вам нужно убедиться, что ваше значение данных MacApp в Setup.hs получает соответствующий режим для ChaseDeps (используйте ChaseWithDefaults вместо DoNotChase) для создания распространяемых пакетов приложений.

Если вы сделали это, но все еще получаете ту же ошибку, я бы проверил в результирующем комплекте приложений, чтобы увидеть, скопированы ли там необходимые библиотеки вообще. Вы можете найти достаточно информации, чтобы сообщить об ошибке сопровождающему cabal-macosx.

редактировать

Исходя из того, что вы включили, установка выглядит корректно, и, по-видимому, она по крайней мере скопировала зависимости библиотеки. Я думаю, что проблема, вероятно, связана с пакетом cabal-macosx.

Глядя на исходный код для исправления зависимостей, похоже, что он должен был напечатать кучу "Updating <library>'s dependence on <path> to <path>" линии, как он строил расслоение. Вы видели это? Были ли строки, обновляющие бинарный файл?

Я не очень разбираюсь в процессе компоновки OS X, но я думаю, что если бинарный файл не будет связан после копирования библиотек, его также нужно будет обновить. Вы должны быть в состоянии использовать /usr/bin/otool -L <filename> а также /usr/bin/install_name_tool чтобы вручную исправить пути в двоичных файлах, процесс установки, возможно, пропустил.

Вот справочные страницы для этих двух инструментов:

https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/install_name_tool.1.html

https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/otool.1.html

Другие вопросы по тегам