【发布时间】:2020-04-09 06:12:47
【问题描述】:
注意:我正在使用堆栈。 当我们这样做时(比如在 CentOS 机器上)
stack install --ghc-options='-optl-static -optl-pthread' --force-dirty --local-bin-path path-to-executable(my-project-exe)
新创建的 my-project-exe 可执行文件能否通过运行 ./my-project-exe 跨机器运行(具有相同的操作系统/架构)?
对不起,如果这个问题看起来很基本,但我想从第一原则来理解这一点。
这个 haskell 可执行文件到底是什么?:除了基本的系统/操作系统调用之外,这是一个安装了所有依赖项的单个文件吗?
我的用例:我在我的机器上为我的项目创建了一个 haskell 可执行文件。只需将其复制到具有相同操作系统的另一台机器上,我就可以运行此可执行文件,所需的最少安装次数是多少?新安装数量为零是最好的。
PS:./my-project-exe 在我运行 stack-install 命令的机器上就像一个魅力。
【问题讨论】:
-
在任何 linux 可执行文件上,
ldd name-of-exe应该生成运行时需要的共享库列表。如果这些存在于其他机器中,你应该没问题。 Haskell 可执行文件通常是静态链接的,因此您应该只找到几个 C 库。 -
我运行了命令
stack build --ghc-options='-fPIC -optl-pthread' --force-dirty:在执行 ldd name-of-exe 时,我得到了一个共享库的列表。当我将此可执行文件复制到新机器时,我还需要手动将其中一些 .so 文件复制到该新机器。我的问题是,即使使用 -fPIC 标志(位置无关代码),为什么它仍然依赖于这么多共享库。它不应该构建 1 个独立的可执行文件吗?
标签: haskell ghc haskell-stack haskell-platform