如何让堆栈使用动态链接?

时间:2016-08-10 01:48:08

标签: haskell haskell-stack

我正在使用stack来构建项目,并发现即使对于简单程序,生成的可执行文件也非常大(10M)。为了减少可执行文件的大小,我如何让stack构建共享库并生成动态链接到共享库的可执行文件?

1 个答案:

答案 0 :(得分:9)

将“-dynamic”添加到.cabal文件中的ghc-options

例如,在stack new simple-example simple生成的项目中,simple可执行文件为1.0M,然后将“-dynamic”添加到ghc-options。改变后它减少到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)