【发布时间】:2016-11-05 18:07:47
【问题描述】:
我正在开发一个链接到一些旧 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 沙箱工作......
【问题讨论】:
-
*** C Compiler:和以下输出来自 ghc。 cabal 是如何调用 ghc 的? -
(如果你只是运行
cabal build -v,最后一行会告诉你。) -
这是输出:gist link
-
在您介绍的内容中有一些我不明白的地方,但我很确定
--with-gcc标志在这里实际上并不重要。你可能有一些秘密ghc-options设置吗? -
无论如何,您需要标志
-pgml /opt/gcc-3.3.6/bin/gcc让 ghc 使用/opt/gcc-3.3.6/bin/gcc进行链接步骤。
标签: haskell gcc linker cabal ffi