Дублированный символ, определенный в библиотеке импорта DLL в сборке MinGW - PullRequest
0 голосов
/ 23 января 2019

У меня есть статическая библиотека libA-static, которая определяет функцию privateFunction и связана с библиотекой libB-static.libB-static реализует много вещей, но экспортирует только одну функцию publicFunction.libB-static затем связывается с общей библиотекой libC-shared, которая реэкспортирует publicFunction.Как предложено здесь и здесь , я компилирую все библиотеки с -fvisibility=hidden, помечаю public как видимую по умолчанию и связываю libB-static с libC-shared как весь архив.

Моя основная программа зависит от libC-shared и libA-static.Настройка отлично работает на Linux, Mac (и на Windows тоже), но на MinGW не удается установить соединение с несколькими определениями символа privateFunction.Второе определение взято из библиотеки импорта libC-shared.dll.a.Размер библиотеки импорта просто смешен для одного экспортируемого символа (10 МБ), и, похоже, он содержит как минимум целые libB-static.

Я пытался связать libC-shared с -Wl,--exclude-libs,All и размер импортабиблиотека в этом случае составляет 1 КБ, но publicFunction тогда не разрешена.Я также пытался связать libC-shared с -Wl,--exclude-libs,libB-static, но в этом случае связывание libC-shared не может решить privateFunction.

Это команда связывания, созданная CMake, где libC-shared=GraphicsEngineOpenGL-shared, libB-static=GraphicsEngineOpenGL-static и libA - это все остальные статические библиотеки:

C:\PROGRA~1\MINGW-~1\X86_64~1.0-P\mingw64\bin\G__~1.EXE    -shared -o GraphicsEngineOpenGL-shared.dll -Wl,--out-implib,libGraphicsEngineOpenGL-shared.dll.a -Wl,--major-image-version,0,--minor-image-version,0 -Wl,--whole-archive CMakeFiles\GraphicsEngineOpenGL-shared.dir/objects.a -Wl,--no-whole-archive -Wl,--whole-archive libGraphicsEngineOpenGL-static.a -Wl,--no-whole-archive ../GLSLTools/libGLSLTools.a ../HLSL2GLSLConverterLib/libHLSL2GLSLConverterLib.a ../GraphicsEngine/libGraphicsEngine.a ../GraphicsAccessories/libGraphicsAccessories.a ../../Common/libCommon.a ../../Platforms/Win32/libWin32Platform.a ../../Platforms/Basic/libBasicPlatform.a -lShlwapi ../../Primitives/libPrimitives.a ../../External/glew/libglew-static.a -lopengl32 -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32 

Моя главная проблема, очевидно, - связывание ошибок, но нелепый размер библиотеки импорта, вероятно, является ключом к ответу.

...