本地依赖项中出现“多重定义”链接器错误导致构建失败

12

我维护了一个使用CircleCI进行持续集成的开源框架。最近在相当奇怪的情况下,项目突然无法构建。

第27次构建是最后一次成功的。之后,我对依赖关系进行了一些微小的更改,并注意到构建失败了。我试图修复它,但没有成功,所以我回滚到了上一个工作配置但仍然失败了

失败的原因是两个依赖项,都是本地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也会出现相同的问题(因此不太可能会引入两个版本的相同模块,导致这些冲突)。

我还提取了一个详细的cabal安装日志。


我再次使用SSH克隆OpenGLRaw的原始源代码,但结果仍然相同。尝试了7.6.3版本,仍然没有改进。

1
我有一个类似的问题(也是使用CircleCI),但是与direct-sqlite-2.3.16有关。 - jpvillaisaza
2
有什么进展吗?hslua 似乎也遇到了同样的问题。请参见 https://github.com/commercialhaskell/stack/issues/1624 和 https://github.com/osa1/hslua/issues/40。 - jpvillaisaza
1
@jpvillaisaza 我已经将此事升级到我能够达到的最高级别,或许除了Haskell Reddit之外。现在是时候在这里发布赏金并祈求最佳结果了。 - Bartek Banachewicz
1
尝试添加 -v3 ghc 选项,并再次发布构建日志以查看 ghc 在这里的确切操作。我敢打赌,它与 --dynamic-too 搭配使用会很混乱。 - Yuras
2
@jpvillaisaza 不用在意,我已经自己解决了。你说得对,问题是由于容器更新引起的。 - Yuras
显示剩余3条评论
1个回答

14

看起来是与 gcc-4.9.2 有关的问题。我fork了您的项目,启动了一个高详细度构建,连接到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开发人员报告错误。

添加:这里是一个示例,说明如何切换gcc版本。而这里则是一个成功构建的例子。


2
这太棒了。非常感谢! - Bartek Banachewicz
2
非常感谢您。我已经为构建HsOpenSSL苦苦挣扎了几天,一直在解决这个问题! - mightybyte
有没有人能够分享一个GCC错误报告的链接给我? - Kevin Tindall

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接