繁体   English   中英

可执行文件的ghc-options是否会覆盖链接库的ghc-options?

[英]Will ghc-options of an executable override ghc-options of linked libraries?

我有一个主要的Haskell可执行程序与cabal文件。 在那里,我指定了ghc-options

这个可执行文件链接到荒野中的其他库。 这些库的cabal文件的ghc-options是否会被忽略?

我基本上想知道可执行文件的ghc-options是否会用于整个enchilada(主要的可执行文件+库)。

额外的赏金注释:请在下面扩展chi的评论,即编译链接的 ghc-options之间的区别是什么。 在图书馆中哪些是哪些,哪些是永远不需要的? 也许你可以谈谈一些最重要的问题,比如下面提到的 - -threaded

在正常的cabal-install工作流程(以及在其上构建的stack工作流程)下,Cabal文件中指定的标志对于包是本地的,不应触发重建。 同样,在命令行中使用--ghc-options options指定--ghc-options对于包是本地的。

对于关于-threaded的具体问题,这个标志对库代码没有影响(就像cabal-install会告诉你的那样),只对可执行文件有影响。

此处提供GHC标志的简要列表。 特别要注意的是, -threaded列在“ 链接选项”下 ,还有一个指向“ 影响链接的选项”的链接 根据这些信息,我们得出结论, -threaded仅对可执行文件有意义,因为它向GHC发出信号,表示我们希望使用线程运行时。 如果您的包不提供可执行文件,则不需要任何运行时,线程或其他。

有关编译与链接的高级解释:它们是源代码和可执行文件之间的两个步骤。 编译是从源代码生成目标文件的过程。 链接是连接组成可执行文件的众多目标文件的过程。 当你编译一个可执行文件时,它不知道一个函数,比如map存在,除非你定义它,所以它只是在它假设的情况下编译。 链接步骤是我们使所有这些名称可用且有意义的地方。 -threaded的情况下,我们使链接进程知道线程运行时,运行时调用的所有代码都将使用。

由于我不知道您是否使用标准的cabal工作流程, stack或新的cabal.project工作流程,因此这里是一个讨论在cabal.project案例中讨论此行为的题外话。

这实际上是一个开放的bug,现在。

该错误在Cabal GitHub上被跟踪为问题3883 (并且在相关问题4247中有所讨论)。

与您的问题相关,根据当前行为,在cabal.project文件中的ghc-options节中指定标志会导致使用这些标志编译(或重新编译,视情况而定)这些依赖项。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM