首页 > 解决方案 > MinGW 构建中的 dll 导入库中定义的重复符号

问题描述

我有libA-static定义函数privateFunction并链接到 library的静态库libB-staticlibB-static实现了很多东西,但只导出了一个函数publicFunction。然后链接到重新导出的libB-static共享库 中。正如这里这里所建议的,我编译所有库,使用默认可见性标记公共并链接到整个档案。libC-sharedpublicFunction-fvisibility=hiddenlibB-staticlibC-shared

我的主程序依赖于libC-sharedand libA-static。该设置在 Linux、Mac(以及 Windows 上)上运行良好,但在 MinGW 链接失败并出现多个 symbol 定义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 

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

标签: c++mingwmingw-w64

解决方案


推荐阅读