У меня есть статическая библиотека 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
Моя главная проблема, очевидно, - связывание ошибок, но нелепый размер библиотеки импорта, вероятно, является ключом к ответу.