Сбой сборки из-за ошибок компоновщика "множественного определения" в собственных зависимостях
Я поддерживаю среду с открытым исходным кодом, которая использует 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
. И здесь - успешная сборка.