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

dat*_*olf 15 linker haskell

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

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

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

编辑以解决附带问题

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

dar*_*int 9

dcoutts将此作为reddit评论发布:

你可以用ghc做同样的事情.

gcc -c prog.c -o prog.o
gcc prog.o libfoo.a -o prog
Run Code Online (Sandbox Code Playgroud)

而且,与ghc相同......

ghc -c prog.hs -o prog.o
ghc prog.o libfoo.a -o prog 
Run Code Online (Sandbox Code Playgroud)


ham*_*mar 6

您可以使用-optl将选项直接传递给链接器,因此要静态链接所有内容,您可以使用:

ghc --make Main.hs -optl-static -optl-pthread
Run Code Online (Sandbox Code Playgroud)

GHC-Options如果您使用的是Cabal ,请将其放入.

您可以进一步调整此内容,以便对静态或动态链接的内容进行更精细的控制.该-v(详细)选项,就是看最后的链接命令有帮助这里.