gpt4 book ai didi

haskell - 由于 native 依赖项中的 "multiple definition"链接器错误,构建失败

转载 作者:IT老高 更新时间:2023-10-28 11:21:19 26 4
gpt4 key购买 nike

我维护一个使用 CircleCI 的开源框架用于持续集成。我最近遇到了一个问题,该项目在相当奇怪的情况下突然拒绝 build 。

Build 27是最后一个成功的。之后,我对依赖项做了一些小改动,发现构建失败了。我试图修复它但没有成功,所以我恢复到最后的工作配置and it still failed .

失败的原因是两个依赖,都是绑定(bind)到原生 C 库:OpenGL (OpenGLRaw) 和 GLFW (bindings-glfw)。他们在链接阶段出错,有很多行:

/tmp/ghc18975_0/ghc18975_6.o:(.data+0x0): multiple definition of `__stginit_bindizu0Qm7f8FzzUN32WFlos7AKUm_BindingsziGLFW'
/tmp/ghc18975_0/ghc18975_6.o:(.data+0x0): first defined here

我完全不知道为什么会发生这种情况。当原始构建通过时,这些库的完全相同的版本被重新构建,并且在 CI 上它每次都使用一个新容器(我显然已经尝试过清理缓存)。该构建涉及 apt-get updatecabal update,因此有可能更改了某些外部资源。

如果有人遇到过此类或类似的问题,它可能会极大地帮助诊断和消除问题。谷歌搜索这个特定的 multiple definition 问题没有任何结果。


我尝试更新 cabal 版本(因为互联网上的一些提示指出了它),但是:

cabal-install version 1.22.6.0
using version 1.22.4.0 of the Cabal library

问题依然存在。


我忘记提到的一件重要的事情是,这看起来并不像一些简单的包混淆。我通过 SSH 连接到那个盒子,在那里创建了一个空文件夹和一个沙箱,甚至简单的 cabal install OpenGLRaw 也因同样的问题而失败(所以它本身不太可能会引入相同的两个版本可能导致这些冲突的模块)。


I've also extracted a verbose cabal installation log .


又做了 SSH,克隆了 OpenGLRaw 的原始资源,还是一样。试过7.6.3,还是一样。

最佳答案

这似乎是 gcc-4.9.2 的问题。我 fork 了你的项目,开始了 build with high verbosity level ,连接到 circleci 容器并运行确切的链接命令。它以同样的方式失败:

ubuntu@box1305:~$ /usr/bin/gcc -fno-stack-protector -DTABLES_NEXT_TO_CODE '-Wl,--hash-size=31' -Wl,--reduce-memory-overheads -Wl,--no-as-needed -nostdlib -Wl,-r -nodefaultlibs '-Wl,--build-id=none' -o Types.o /tmp/ghc17998_0/ghc_15.ldscript
/tmp/ghc17998_0/ghc_14.o: In function `r2vy_closure':
(.data+0x0): multiple definition of `__stginit_OpenGzu8rT20eO9AxEKIONeYf57cS_GraphicsziRenderingziOpenGLziRawziTypes'
/tmp/ghc17998_0/ghc_14.o:(.data+0x0): first defined here
/tmp/ghc17998_0/ghc_14.o: In function `r2vy_closure':
(.data+0x8): multiple definition of `OpenGzu8rT20eO9AxEKIONeYf57cS_GraphicsziRenderingziOpenGLziRawziTypes_makeGLDEBUGPROC_closure'
/tmp/ghc17998_0/ghc_14.o:(.data+0x8): first defined here
/tmp/ghc17998_0/ghc_14.o: In function `c2y7_info':
(.text+0xc0): multiple definition of `OpenGzu8rT20eO9AxEKIONeYf57cS_GraphicsziRenderingziOpenGLziRawziTypes_makeGLDEBUGPROC_info'
/tmp/ghc17998_0/ghc_14.o:(.text+0xc0): first defined here

但是使用 gcc-4.8 它可以工作:

ubuntu@box1305:~$ /usr/bin/gcc-4.8 -fno-stack-protector -DTABLES_NEXT_TO_CODE '-Wl,--hash-size=31' -Wl,--reduce-memory-overheads -Wl,--no-as-needed -nostdlib -Wl,-r -nodefaultlibs '-Wl,--build-id=none' -o Types.o /tmp/ghc17998_0/ghc_15.ldscript
ubuntu@box1305:~$

所以你应该切换到旧的 gcc 并可能向 gcc 开发人员报告一个错误。

添加: Here是如何切换 gcc 版本的示例。和here是一个成功的构建。

关于haskell - 由于 native 依赖项中的 "multiple definition"链接器错误,构建失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34654262/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com