相关疑难解决方法(0)

将Yesod部署到Heroku,无法静态构建

我是Yesod的新手,我无法静态构建Yesod,因此我可以部署到Heroku.

我更改了默认的.cabal文件以反映静态编译

if flag(production)
   cpp-options:   -DPRODUCTION
   ghc-options:   -Wall -threaded -O2 -static -optl-static
else
   ghc-options:   -Wall -threaded -O0
Run Code Online (Sandbox Code Playgroud)

它不再构建.我得到了一大堆警告,然后是一大堆未定义的引用,如下所示:

Linking dist/build/personal-website/personal-website ...
/usr/lib/ghc-7.0.3/libHSrts_thr.a(Linker.thr_o): In function
`internal_dlopen':
Linker.c:(.text+0x407): warning: Using 'dlopen' in statically linked
applications requires at runtime the shared libraries from the glibc
version used for linking
/usr/lib/ghc-7.0.3/unix-2.4.2.0/libHSunix-2.4.2.0.a(HsUnix.o): In
function `__hsunix_getpwent':
HsUnix.c:(.text+0xa1): warning: Using 'getpwent' in statically linked
applications requires at runtime the shared libraries from the glibc
version used for linking
/usr/lib/ghc-7.0.3/unix-2.4.2.0/libHSunix-2.4.2.0.a(HsUnix.o): In
function `__hsunix_getpwnam_r':
HsUnix.c:(.text+0xb1): warning: Using 'getpwnam_r' in …
Run Code Online (Sandbox Code Playgroud)

linux haskell heroku static-linking yesod

27
推荐指数
2
解决办法
3万
查看次数

如何有选择地将某些系统库静态链接到Haskell程序二进制文件?

我目前正在开发一些用Haskell编写的Web应用程序.所有Haskell库都是静态链接的; 虽然这会"膨胀"可执行文件,但它不是一个问题,因为它将是服务器上运行的唯一Haskell程序.

但是,我也想摆脱依赖libgmp.so,即我想将multiprecision库静态链接到程序中,但保持所有其他系统库(如pthread,libc和libm)动态链接.

哪个链接器切换到ghc做那个技巧?

编辑以解决附带问题

是否可以禁用标准库的默认链接,默认情况下将其引入每个Haskell程序?像GCC这样的东西相当于-nostdlib

linker haskell

15
推荐指数
2
解决办法
1388
查看次数

Haskell二进制兼容性

假设我编写了一些Haskell代码并在Ubuntu 64位安装中编译它,静态链接所有Haskell软件包和c库.结果是否与任何其他64位Linux发行版二进制兼容?

haskell static-linking binary-compatibility

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

移动已编译的Haskell程序

我想在一个Linux机器上编译一个Haskell程序,然后在另一个Linux机器上运行它.但是,这似乎根本不起作用.我收到有关缺少库的错误.

据推测,当我安装GHC时,包管理器还会安装所需的所有库和内容.[我有些恼怒地注意到至少有一个包装系统无法安装GCC,如果没有GHC,GHC显然无法运行......]但是当然,目标系统没有安装这些依赖项.因此,如果我将已编译的二进制文件复制到目标系统,它就无法运行.

有什么方法可以解决这个问题吗?我习惯使用Windows,如果你编译一些东西,它只适用于所有Windows系统.(至少,直到你真正尝试使用非标准设施,如数据库访问或其他东西......)我在Haskell中编译了Hello World,将其复制到另一个Linux盒子,并抱怨libgmp.so.10缺失或像那样神秘的mumbo-jumbo.

只是为了让事情变得有趣:我只有FTP访问目标机器,而不是shell访问.我甚至不完全确定它正在运行什么操作系统.所以我可以以任何我想要的方式更改我的构建机器,但除了将文件复制到目标机器之外,我无法对目标机器做任何事情.

linux haskell ghc

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

如何生成带有堆栈的静态链接 Haskell 二进制文件?

我想为 Haskell 构建一个静态二进制可执行文件(在我的例子中,重要的是不要依赖任何系统库)。我使用堆栈作为我的首选构建工具。应该设置哪些标志来实现这一目标?对每一项的简要解释可加分。

haskell stackage

8
推荐指数
0
解决办法
1520
查看次数

什么决定了OS X上GHC的链接行为?

我在编译二进制文件时观察两台机器之间的不同链接行为.

每个都有相同的GHC(7.8.3),相同的代码,相同的标志(-Wall -O2),相同的libgmp(每个都由Homebrew安装):

machine-one$ otool -L my-binary
my-binary:
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1)
        /usr/lib/libiconv.2.dylib (compatibility version 7.0.0, current version 7.0.0)

machine-two$ otool -L my-binary
my-binary:
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1)
        /usr/lib/libiconv.2.dylib (compatibility version 7.0.0, current version 7.0.0)
        /usr/local/lib/libgmp.10.dylib (compatibility version 13.0.0, current version 13.0.0)
Run Code Online (Sandbox Code Playgroud)

我不能为我的生活弄清楚为什么libgmp在第二台机器上动态链接.

就差异而言,我已经能够认识到:GHC已经通过第一台机器上的OS X二进制分发版和第二台机器上的Homebrew进行了安装.对于C编译器,我们有:

machine-one$ cc --version
Apple LLVM version 6.0 (clang-600.0.51) (based on LLVM 3.5svn)
Target: x86_64-apple-darwin13.4.0
Thread model: posix

machine-two$ cc --version
Apple …
Run Code Online (Sandbox Code Playgroud)

macos haskell dynamic-linking ghc static-linking

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

将musl与ghc静态连接

我正在尝试使用GHC构建一个静态二进制文件,用于在Haskell中编写的基于CGI的Web应用程序,以部署在共享服务器上.

我想用musl,就像这个答案所说的那样.

不幸的是,这不是一件容易的事:

$ ghc -static -optl-static -pgmc musl-gcc -pgml musl-gcc -L/usr/local/lib app.hs
[1 of 1] Compiling Main             ( app.hs, app.o )
Linking app...
/usr/lib/ghc-7.6.3/libHSrts.a(Itimer.o): In function `exitTicker':
(.text+0x1af): undefined reference to `__sysv_signal'
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?(完全免责声明:我是Haskell新手(:)

我使用的是Arch Linux,GHC 7.6.3和Network.CGI.

haskell ghc

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