MinGW构建中的dll导入库中定义的重复符号

时间:2019-01-23 16:31:40

标签: c++ mingw mingw-w64

我有一个静态库libA-static,它定义了功能privateFunction,并链接到库libB-static中。 libB-static实现了很多东西,但仅导出一个功能publicFunction。然后将libB-static链接到共享库libC-shared中,该共享库将重新导出publicFunction。按照建议的herehere,我使用-fvisibility=hidden编译所有库,使用默认可见性标记public,然后将libB-static链接到libC-shared作为整个档案。

我的主程序取决于libC-sharedlibA-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-sharedlibB-static=GraphicsEngineOpenGL-staticlibA是所有其他静态库:

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 

我的主要问题显然是链接错误,但是导入库的可笑大小可能是答案的关键。

0 个答案:

没有答案