2016-08-10 16 views
10

Używam stack do budowania projektów i stwierdzam, że wygenerowane pliki wykonywalne są dość duże (10M), nawet dla prostych programów. Aby zmniejszyć rozmiar pliku wykonywalnego, jak mogę uzyskać stack budować biblioteki współdzielone i generować pliki wykonywalne, które dynamicznie łączą się z bibliotekami współdzielonymi?Jak uzyskać stos do dynamicznego łączenia?

+0

Czasami warto spojrzeć na https://ghc.haskell.org/trac/ghc/wiki/SharedLibraries/PlatformSupport i 'parametr -ghc-options' do' stosu build' – Alec

Odpowiedz

8

Dodaj "-dynamiczny" do ghc-options w pliku .cabal.

Na przykład w projekcie wygenerowanym przez stack new simple-example simple, plik wykonywalny simple miał 1,0M przed dodaniem "-dynamicznej" do ghc-options. Po zmianie nastąpiła redukcja do 12K.

Tutaj jest odpowiednia część simple-example.cabal:

executable simple-example 
    hs-source-dirs:  src 
    main-is:    Main.hs 
    default-language: Haskell2010 
    build-depends:  base >= 4.7 && < 5 
    ghc-options:   -dynamic 

budować z stack build (wymagane są żadne opcje).

Aby pokazać, z którymi bibliotekami jest dynamicznie związany, można użyć narzędzia ldd (lub otool -L na komputerze Mac).

$ otool -L .stack-work/install/x86_64-osx/lts-6.10/7.10.3/bin/simple-example 
.stack-work/install/x86_64-osx/lts-6.10/7.10.3/bin/simple-example: 
     @rpath/libHSbase-4.8.2.0-HQfYBxpPvuw8OunzQu6JGM-ghc7.10.3.dylib (compatibility version 0.0.0, current version 0.0.0) 
     @rpath/libHSinteger-gmp-1.0.0.0-2aU3IZNMF9a7mQ0OzsZ0dS-ghc7.10.3.dylib (compatibility version 0.0.0, current version 0.0.0) 
     @rpath/libHSghc-prim-0.4.0.0-8TmvWUcS1U1IKHT0levwg3-ghc7.10.3.dylib (compatibility version 0.0.0, current version 0.0.0) 
     @rpath/libHSrts-ghc7.10.3.dylib (compatibility version 0.0.0, current version 0.0.0) 
     @rpath/libffi.dylib (compatibility version 7.0.0, current version 7.2.0) 
     /usr/lib/libiconv.2.dylib (compatibility version 7.0.0, current version 7.0.0) 
     /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1226.10.1)