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

Build fails because of "multiple definition" linker errors in native dependencies

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

Build 27 was the last one that succeeded. After that, I made some minor changes to dependencies and noticed that the build fails. I've tried to fix it without success, so I reverted back to last working configuration and it still failed.

失败的原因是两个依赖项,它们都绑定到本机 C 库:OpenGL (OpenGLRaw) 和 GLFW (bindings-glfw)。他们在 link 阶段出错,其中有许多行:

/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,因此可能更改了某些外部资源。

如果有人遇到过这样或类似的问题,它可能会极大地帮助诊断和解决问题。 Google 搜索该规模的这个特定 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 的问题。我分叉了你的项目,启动了一个 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 is an example how to switch gcc version. And here 构建成功。