相关疑难解决方法(0)

ghc编译的二进制文件是否需要GHC或它们是独立的吗?

如果朋友想要运行我的Haskell二进制文件,他是否必须先安装Haskell,还是可以立即自行运行二进制文件?

答案在Mac,Windows和Linux上是否相同?

binary linker executable haskell

45
推荐指数
4
解决办法
6240
查看次数

制作小的haskell可执行文件?

有没有什么好方法可以制作小的haskell可执行文件?使用ghc6,一个简单的hello world程序似乎达到了370kB(在strip之前为523kB).C中的Hello世界大约是4kB(剥离前9kB).

linker haskell ghc static-linking

40
推荐指数
7
解决办法
8494
查看次数

减少GHC生成的可执行文件的大小

使用GHC版本7.4.2和-O3之类的标志,我仍然可以获得巨大的可执行文件.我理解GHC做静态链接,二进制的依赖关系如下:

    linux-vdso.so.1 (0x00007fff49bff000)
    libpcre.so.1 => /usr/lib/libpcre.so.1 (0x00007fe658d6c000)
    librt.so.1 => /usr/lib/librt.so.1 (0x00007fe658b64000)
    libutil.so.1 => /usr/lib/libutil.so.1 (0x00007fe658961000)
    libdl.so.2 => /usr/lib/libdl.so.2 (0x00007fe65875d000)
    libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007fe658541000)
    libcurl.so.4 => /usr/lib/libcurl.so.4 (0x00007fe6582e3000)
    libgmp.so.10 => /usr/lib/libgmp.so.10 (0x00007fe658074000)
    libm.so.6 => /usr/lib/libm.so.6 (0x00007fe657d7a000)
    libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x00007fe657b65000)
    libc.so.6 => /usr/lib/libc.so.6 (0x00007fe6577be000)
    /lib/ld-linux-x86-64.so.2 (0x00007fe658fca000)
    libssh2.so.1 => /usr/lib/libssh2.so.1 (0x00007fe657595000)
    libssl.so.1.0.0 => /usr/lib/libssl.so.1.0.0 (0x00007fe65732b000)
    libcrypto.so.1.0.0 => /usr/lib/libcrypto.so.1.0.0 (0x00007fe656f22000)
    libz.so.1 => /usr/lib/libz.so.1 (0x00007fe656d0c000
Run Code Online (Sandbox Code Playgroud)

到目前为止它看起来相当不错,但是在二进制文件中我可以看到这些行:

GHCi runtime linker: fatal error: I found a duplicate definition for symbol
* Specifying the same object file …
Run Code Online (Sandbox Code Playgroud)

executable haskell ghc

19
推荐指数
1
解决办法
2654
查看次数

为什么Haskell/GHC可执行文件在文件大小中如此之大?

可能重复:
用GHC编译成小二进制的小Haskell程序

最近我注意到Haskell可执行文件有多大.下面的所有内容都是-O2在Linux 上用GHC 7.4.1编译的.

  1. Hello World(main = putStrLn "Hello World!")超过800 KiB.strip在它上面运行会将文件大小减少到500 KiB; 甚至添加-dynamic到编译中也没有多大帮助,让我在400 KiB附近删除了一个可剥离的可执行文件.

  2. 编译涉及Parsec的非常原始的示例产生1.7 MiB文件.

    -- File: test.hs
    import qualified Text.ParserCombinators.Parsec as P
    import Data.Either (either)
    
    -- Parses a string of type "x y" to the tuple (x,y).
    testParser :: P.Parser (Char, Char)
    testParser = do
        a <- P.anyChar
        P.char ' '
        b <- P.anyChar
        return (a, b)
    
    -- Parse, print result.
    str = "1 2"
    main = print $ …
    Run Code Online (Sandbox Code Playgroud)

haskell compilation ghc

16
推荐指数
2
解决办法
4464
查看次数

使用Haskell包'插件'时如何减少二进制占用空间?

我已经为我的Main.hs模块实现了一个简单的加载器用于haskell插件.我现在使用的唯一功能是load来自这个网站

查看我编译的应用程序大小,向我展示了x86架构上超过53 MB的可执行文件.我知道GHC的大部分内容都是链接的(由于haskell-source-to-binary-plugin功能),但这对我的目的来说太过分了.

是否有官方批准的方式来削减额外的功能,只保留(dyn-)load

plugins haskell footprint

14
推荐指数
1
解决办法
358
查看次数

无法找到模块Prelude ... dyn库的包基础?

尝试按照减少haskell的二进制问题的答案中提出的解决方案,当我使用选项安装时,我不断收到错误:--enable-shared

> cabal install opengl --enable-shared --reinstall   
...
Could not find module `Prelude' 
Perhaps you haven't installed the "dyn" libraries for package `base'?
Run Code Online (Sandbox Code Playgroud)

尝试了一切.我正在使用apt-get installedhaskell-platform(使用ghc 7.4.1),在Ubuntu 12.04,64bit上.

有小费吗?

haskell cabal

9
推荐指数
1
解决办法
7569
查看次数

Haskell:模块导入不必要的二进制增长

当我通过以下方式之一将(大)模块导入主模块时:

import Mymodule
import qualified Mymodule as M
import Mymodule (MyDatatype)
Run Code Online (Sandbox Code Playgroud)

与不导入该模块时相比,编译后的二进制文件增长量相同.无论我是否在主模块中使用该模块内的任何内容,都会发生这种情况.不应该编译器(我在Debian测试中使用GHC)只添加运行它所需的二进制文件吗?

在我的具体情况下,我在Mymodule中有一个巨大的Map,我没有在Main模块中使用它.有选择地导入我真正需要的东西,并没有改变编译二进制文件的增长.

haskell

8
推荐指数
1
解决办法
1128
查看次数

最小的haskell(ghc)程序安装(没有ghc/cabal的部署)

(我的问题是关于没有haskell-platform,ghc,cabal等的分发二进制文件)

我需要部署一个良好的cabal形成haskell应用程序(一个Yesod脚手架),但我有磁盘空间限制.

GHC大小约为1Gbytes,存储所有cabal源代码,包等...需要更多磁盘空间等...

显然,haskell-platform,ghc,...是关于开发(不是部署).

在我的具体情况下,我可以生成

cabal clean && cabal configure && cabal build
Run Code Online (Sandbox Code Playgroud)

并成功运行(有些像)

./dist/build/MyEntryPoint/MyEntryPoint arg arg arg
Run Code Online (Sandbox Code Playgroud)

但是,依赖关系呢?如何将其转移到生产环境?(连同我的"dist"汇编)

我可以在没有cabal的情况下放置二进制依赖项 怎么样?

非常感谢你!

deployment haskell static-linking yesod

3
推荐指数
1
解决办法
855
查看次数

为什么这个 Haskell 程序的汇编相对于等效的 C 代码来说相当大?或者我编译时做错了什么?

有一次我问为什么简单的“times 2”程序的 Haskell 二进制文件这么大(例如 C++)?,但这被欺骗了用 GHC 编译成巨大的二进制文件的小型 Haskell 程序

\n

我决定问一个类似的问题,但重点是代码的实际作用,因此是它的汇编形式,而不是二进制文件。我还没有找到我的问题的现有答案

\n

所以不,不能回答我的问题。

\n

这是 C++(实际上是 C)的哑程序,它假设给出了 1 个表示数字的命令行参数,将其转换为 anint并将return其乘以 2 作为可执行文件的退出代码(是的,我可以\不超过 255)

\n
int main(int argc, char * argv[]) {\n    int r{0};\n    int c{0};\n    while (argv[1][c] != \'\\0\') {\n        r *= 10;\n        r += argv[1][c++] - \'0\';\n    }\n    return r*2;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

汇编非常短(共 21 行)

\n
main:                                   # @main\n        mov     rcx, qword ptr [rsi + 8]\n        movzx …
Run Code Online (Sandbox Code Playgroud)

c assembly gcc haskell ghc

2
推荐指数
1
解决办法
214
查看次数

Haskell的Hello世界是1.3 MB

我发现Haskell中的Hello World可执行文件是1.3 MB,我感到非常失望.这对我来说真是不可接受.难道我做错了什么?让hello world可执行文件如此庞大有什么借口?是否有合理的方法来减少这种情况?C中的相同内容是8 kb.

main = print "Hello, worlds"
Run Code Online (Sandbox Code Playgroud)

haskell

1
推荐指数
1
解决办法
288
查看次数