【问题标题】:Cabal selects wrong linkerCabal 选择了错误的链接器
【发布时间】: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


【解决方案1】:

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

使用 -pgml 选择 GHC 手册页中记录的链接器。

(有一点可能会引起其他人的困惑,值得一提。GHC 总是使用 C 编译器 来执行最后的链接步骤。这意味着 -pgml 必须引用 gcc 之类的东西,而不是 ld 之类的东西。因此,打算由 ld 使用的标志(例如 -rpath)必须在被提供给 -optl 之前以 -Wl, 为前缀。)

【讨论】:

    猜你喜欢
    • 2012-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-08
    • 2022-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多