2016-08-10 40 views
10

我使用stack來構建項目,並發現生成的可執行文件對於簡單的程序來說相當大(10M)。爲了減少可執行文件的大小,我如何獲得stack來構建共享庫並生成動態鏈接到共享庫的可執行文件?如何獲取堆棧以使用動態鏈接?

+0

你可能想看看https://ghc.haskell.org/trac/ghc/wiki/SharedLibraries/PlatformSupport和'-ghc-options'參數'堆棧build' – Alec

回答

8

將'-dynamic'添加到您的.cabal文件中的ghc-options

例如,在由stack new simple-example simple生成的項目中,simple可執行文件爲1.0M,然後向ghc-options添加「-dynamic」。改變後降至12K。

這裏的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 

建立與stack build(不需要選項)。

要顯示它動態鏈接的庫,可以使用ldd工具(或Mac上的otool -L)。

$ 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)