Cabal选择错误的链接器

时间:2016-11-05 18:07:48

标签: haskell gcc linker cabal ffi

我正在研究一个与一些旧的C ++代码相关联的Haskell程序。我创建了一个C接口,并且只使用ghc。现在我尝试将使用过的Makefile转换为Cabal项目,现在最后一步的cabal选择了错误的链接器。

由于某些依赖关系,我必须使用相当古老的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

对于编译和中间配置链接一切正常,-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 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作为链接器,这是系统之一,因此我得到链接错误,它应该是/opt/gcc-3.3.6/bin/gcc(必须使用3.4.0之前的gcc,因为其中一个使用过的C ++库和gcc 3.3.6的链接兼容性是旧ABI的最新版本。

那么我做错了什么? Cabal说它从旧的gcc中选择了链接器,但实际上却使用了系统中较新的一个?

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

1 个答案:

答案 0 :(得分:2)

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

使用-pgml选择链接,如GHC手册页中所述。

(有一点可能会引起其他人的混淆,值得一提.GHC总是使用 C编译器来做最后的链接步骤。这意味着-pgml必须引用类似{ {1}},而不是gcc之类的内容。因此ld ld打算使用的标志必须以-rpath为前缀,然后才会被-Wl,提供}。)