Cabal 选择了错误的链接器

Cabal selects wrong linker

我正在开发一个 Haskell 程序,该程序 link 是一些旧的 C++ 代码。我创建了一个 C 接口并让它只与 ghc 一起工作。现在我尝试将使用过的 Makefile 转换为 Cabal 项目,现在 cabal 在最后一步选择了错误的 linker.

由于某些依赖关系,我必须使用非常旧的 ghc 和 gcc。所以我正在做的是像这样调用 cabal (1.24.0.0.):

cabal install --with-ghc=ghc-7.6.3 --with-gcc=/opt/gcc-3.3.6/bin/gcc  --with-ld=/opt/gcc-3.3.6/bin/gcc

对于编译和中间配置 link 一切正常,使用 -v3 我得到以下几行:

Using gcc version 3.3.6 given by user at: /opt/gcc-3.3.6/bin/gcc
Using ghc version 7.6.3 given by user at: /home/oswald/ghcs/bin/ghc-7.6.3
...
Using ld given by user at: /opt/gcc-3.3.6/bin/gcc

一切正常,直到最后 linking 步骤:

Linking dist/dist-sandbox-c45ed4c7/build/MISCconfig/MISCconfig ...
*** C Compiler:
'/opt/gcc-3.3.6/bin/gcc' '-c' '/tmp/ghc28340_0/ghc28340_0.c' '-o' ...               
*** C Compiler:
'/opt/gcc-3.3.6/bin/gcc' '-c' '/tmp/ghc28340_0/ghc28340_0.s' '-o' ...    
*** Linker:
'/usr/bin/gcc' '-fno-stack-protector' '-Wl,--hash-size=31' '-W

所以最后一行将 /usr/bin/gcc 指定为 linker,这是系统错误,因此我在应该是 /opt/gcc-3.3.6/bin/gcc 的地方得到 link 错误(有使用 3.4.0 之前的 gcc,因为 link 与使用的 C++ 库之一兼容,gcc 3.3.6 是最新的旧 ABI)。

所以我做错了什么? Cabal 说它从旧的 gcc 中选择 linker 但实际上使用系统中的较新的?

当我在 makefile 中使用带有 -pgmc /opt/gcc-3.3.6/bin/gcc 开关的 ghc 时一切正常,但我更愿意让 cabal 沙箱工作...

这显然与 Cabal 无关,Cabal 不指示 GHC 使用 Cabal 选项指定的 C 编译器 --with-gcc

使用 -pgml 到 select linker,如 GHC 手册页中所述。

(有一点可能会让其他人感到困惑,值得一提。GHC 总是使用 C 编译器 来完成最后的 link 步骤。这意味着 -pgml 必须引用类似 gcc 的内容,而不是类似 ld 的内容。因此,要由 ld 使用的标志(例如 -rpath 必须以 [=17= 为前缀] 在被喂给 -optl 之前。)