Как получить стек для динамической компоновки?

Я использую stack для создания проектов и обнаруживаю, что сгенерированные исполняемые файлы довольно большие (10M) даже для простых программ. Чтобы уменьшить размер исполняемого файла, как я могу получить stack для создания разделяемых библиотек и создания исполняемых файлов, которые динамически связывают с разделяемыми библиотеками?

Ответ 1

Добавьте '-dynamic' в ghc-options в ваш .cabal файл.

Например, в проекте, сгенерированном stack new simple-example simple, исполняемый файл simple был 1.0M перед добавлением '-динамического' в ghc-options. После изменения он уменьшился до 12 К.

Здесь соответствующая часть 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 (или otool -L на 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)