我有一个静态库libA-static
,它定义了功能privateFunction
,并链接到库libB-static
中。 libB-static
实现了很多东西,但仅导出一个功能publicFunction
。然后将libB-static
链接到共享库libC-shared
中,该共享库将重新导出publicFunction
。按照建议的here和here,我使用-fvisibility=hidden
编译所有库,使用默认可见性标记public,然后将libB-static
链接到libC-shared
作为整个档案。
我的主程序取决于libC-shared
和libA-static
。该设置在Linux,Mac(以及Windows)上也可以正常运行,但是在MinGW上,链接失败,并带有符号privateFunction
的多个定义。第二个定义来自导入库libC-shared.dll.a
。对于单个导出符号(10MB)来说,导入库的大小是可笑的,看起来它至少包含整个libB-static
。
我尝试将libC-shared
与-Wl,--exclude-libs,All
链接,在这种情况下,导入库的大小为1 KB,但是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
我的主要问题显然是链接错误,但是导入库的可笑大小可能是答案的关键。