Сбой сборки из-за ошибок компоновщика "множественного определения" в собственных зависимостях

Я поддерживаю среду с открытым исходным кодом, которая использует 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 update, так и cabal 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 удалось с той же проблемой (так что маловероятно, что это само потянет две версии одного и того же модуля, которые могут вызвать эти конфликты).


Я также извлек подробный журнал установки шлюза.


Снова ли SSH, клонированные исходные источники OpenGLRaw, все тот же. Пробовал 7.6.3, все тот же.

Ответ 1

Кажется, проблема с gcc-4.9.2. Я разветкил ваш проект, запустил сборку с высоким уровнем детализации, подключив к контейнеру circleci и выполнив команду точной компоновки. Это не так:

[email protected]:~$ /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 он работает:

[email protected]:~$ /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
[email protected]:~$ 

Итак, вы должны перейти на более старый gcc и, возможно, сообщить об ошибке для gcc разработчиков.

ADDED: Здесь приведен пример переключения версии gcc. И здесь - успешная сборка.