[英]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.