我正在研究一个与一些旧的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沙箱工作......
答案 0 :(得分:2)
这显然与Cabal无关,它没有指示GHC使用Cabal选项--with-gcc
指定的C编译器。
使用-pgml
选择链接,如GHC手册页中所述。
(有一点可能会引起其他人的混淆,值得一提.GHC总是使用 C编译器来做最后的链接步骤。这意味着-pgml
必须引用类似{ {1}},而不是gcc
之类的内容。因此ld
ld
打算使用的标志必须以-rpath
为前缀,然后才会被-Wl,
提供}。)