c++ - MinGW 构建中的 dll 导入库中定义的重复符号
问题描述
我有libA-static
定义函数privateFunction
并链接到 library的静态库libB-static
。libB-static
实现了很多东西,但只导出了一个函数publicFunction
。然后链接到重新导出的libB-static
共享库 中。正如这里和这里所建议的,我编译所有库,使用默认可见性标记公共并链接到整个档案。libC-shared
publicFunction
-fvisibility=hidden
libB-static
libC-shared
我的主程序依赖于libC-shared
and 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-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
我的主要问题显然是链接错误,但导入库的荒谬大小可能是答案的关键。
解决方案
推荐阅读
- python - TypeVar('T', A, B) 和 TypeVar('T', bound=Union[A, B]) 的区别
- java - 蒂卡空结果
- wordpress - 如何让 Wordpress 覆盖 nginx 中的 URL
- ios - Swift .SQLCLIENT 我怎样才能使完成无效?
- wordpress - 如何访问 vc_map() 内部值来为 WPBakery 界面创建自定义标记?
- .net - RDWeb 身份验证和 MFA 与 Azure
- c# - 为什么我的http请求从2017年切换到vs 2019后没有body?
- html - 如何制作具有定义宽度的代码块?
- javascript - Firebase 提供失败的前提条件错误
- html - 响应式设计 - 调整窗口大小时 Div 消失