MinGW G CC: множественное определение деструктора и не виртуального транка - PullRequest
1 голос
/ 08 марта 2020

Я пытаюсь собрать библиотеку элементов после нескольких недавних изменений и не могу сделать ее ссылкой.

Мой набор инструментов:

  • G CC 9.2.1 с потоками MCF
  • CMake 3.16.4

Фиксация, которая нарушает сборку: https://github.com/cycfi/elements/commit/104cef3cc19bf6f568b233a29679135a2c1f06ca

Соответствующая проблема: https://github.com/cycfi/elements/issues/69

флаги компилятора: -DNOMINMAX -DWIN32_LEAN_AND_MEAN -D_UNICODE @CMakeFiles/Buttons.dir/includes_CXX.rsp -O3 -DNDEBUG -flto -fno-fat-lto-objects -std=gnu++17

сообщение об ошибке:

[ 68%] Linking CXX executable Buttons.exe
cd /d D:\Files\C++\workspace_windows\elements_fork\build_fork\examples\buttons && "C:\Program Files\CMake\bin\cmake.exe" -E cmake_link_script CMakeFiles\Buttons.dir\link.txt --verbose=1
"C:\Program Files\CMake\bin\cmake.exe" -E remove -f CMakeFiles\Buttons.dir/objects.a
C:\mingw64\mingw64\bin\gcc-ar.exe cr CMakeFiles\Buttons.dir/objects.a @CMakeFiles\Buttons.dir\objects1.rsp
C:\mingw64\mingw64\bin\g++.exe -O3 -DNDEBUG -flto -fno-fat-lto-objects  -mwindows -Wl,--whole-archive CMakeFiles\Buttons.dir/objects.a -Wl,--no-whole-archive  -o Buttons.exe -Wl,--out-implib,libButtons.dll.a -Wl,--major-image-version,0,--minor-image-version,0 @CMakeFiles\Buttons.dir\linklibs.rsp
C:/mingw64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.1/../../../../x86_64-w64-mingw32/bin/ld.exe: radio_button.cpp.obj (symbol from plugin):(.gnu.linkonce.t._ZN5cycfi8elements18basic_radio_buttonD1Ev[_ZThn208_N5cycfi8elements18basic_radio_buttonD1Ev]+0x0): multiple definition of `cycfi::elements::basic_radio_button::~basic_radio_button()'; main.cpp.obj (symbol from plugin):(.gnu.linkonce.t._ZN5cycfi8elements18basic_radio_buttonD1Ev[_ZThn24_N5cycfi8elements18basic_radio_buttonD1Ev]+0x0): first defined here
C:/mingw64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.1/../../../../x86_64-w64-mingw32/bin/ld.exe: radio_button.cpp.obj (symbol from plugin):(.gnu.linkonce.t._ZN5cycfi8elements18basic_radio_buttonD1Ev[_ZThn208_N5cycfi8elements18basic_radio_buttonD1Ev]+0x0): multiple definition of `non-virtual thunk to cycfi::elements::basic_radio_button::~basic_radio_button()'; main.cpp.obj (symbol from plugin):(.gnu.linkonce.t._ZN5cycfi8elements18basic_radio_buttonD1Ev[_ZThn24_N5cycfi8elements18basic_radio_buttonD1Ev]+0x0): first defined here
C:/mingw64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.1/../../../../x86_64-w64-mingw32/bin/ld.exe: radio_button.cpp.obj (symbol from plugin):(.gnu.linkonce.t._ZN5cycfi8elements18basic_radio_buttonD1Ev[_ZThn208_N5cycfi8elements18basic_radio_buttonD1Ev]+0x0): multiple definition of `non-virtual thunk to cycfi::elements::basic_radio_button::~basic_radio_button()'; main.cpp.obj (symbol from plugin):(.gnu.linkonce.t._ZN5cycfi8elements18basic_radio_buttonD1Ev[_ZThn24_N5cycfi8elements18basic_radio_buttonD1Ev]+0x0): first defined here
collect2.exe: error: ld returned 1 exit status

Текущие наблюдения:

  • Это не ODR проблема нарушения.
  • В проекте нет наследования алмазов.
  • https://github.com/Xeverous/elements/tree/radio-button-build-debug строит, но https://github.com/Xeverous/elements/tree/radio-button-build-debug-1 нет - единственная разница в том, что для ветки -1 я добавил radio_button объекты в пример
  • { ссылка } не помогает (добавлены 3 закомментированные строки для C ++) - у меня обратная проблема Я получаю несколько определений вместо отсутствующего определения
  • Я попробовал пример кода во вложении из https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47218, но он не воспроизводит проблему
  • P проблема не возникает при сборке элементов в виде общей библиотеки
  • Проблема не возникает в типе сборки CMake Debug
  • Проблема не возникает, если LTO не включен
  • Все затронутые классы, у которых есть эта проблема (после попытки множественных коммитов) имеют множественное наследование
...