VS2019使用Qt延迟加载DLL时出现LNK1194链接错误求助
VS2019 Qt DLL延迟加载触发LNK1194错误问题
环境与依赖结构
- 使用VS2019社区版,构建3个存在链式依赖的Qt DLL:
a.dll依赖b.dll,b.dll依赖c.dll - 所有DLL均包含多个继承自QObject的类,这些类带有
Q_OBJECT宏,因此存在staticMetaObject静态成员 - 各DLL的Qt模块依赖:
c.dll:仅依赖Qt6Coreb.dll:依赖Qt6Core、Qt6Gui、Qt6Widgetsa.dll:依赖Qt6Core、Qt6Gui、Qt6Widgets、Qt6Charts、Qt6Svg
问题现象
- 已成功将
a.dll配置为延迟加载b.dll,若取消该配置,调试时加载a.dll会失败,确认延迟加载配置生效 - 尝试将
b.dll配置为延迟加载c.dll时,Debug和Release编译模式下均触发链接器致命错误LNK1194:
Cannot delay-load c.dll due to import of data symbol '"__declspec(dllimport) public: static struct QMetaObject const QSTrade::staticMetaObject" (_imp?staticMetaObject@QSTrade@@2UQMetaObject@@B)'
注:VS为非英文版本,上述为推测的英文错误文本
涉及类的声明代码
class C_EXPORT QSTrade : public QSHolding, public std::enable_shared_from_this<QSTrade>, public QSObject<QSTrade> { Q_OBJECT Q_PROPERTY(int64_t ID READ id) /// Some more Q_PROPERTY, followed by normal class members }; Q_DECLARE_METATYPE(QSTrade*)
疑问点
c.dll中带有staticMetaObject的类数量更多(53个 vsb.dll的24个),且依赖的Qt模块更少,两者编译选项完全一致- 同样涉及
staticMetaObject静态成员,a.dll延迟加载b.dll可行,但b.dll延迟加载c.dll却触发错误
问题
- 为何
a.dll可以正常延迟加载b.dll,但b.dll无法延迟加载c.dll?staticMetaObject似乎并非真正诱因,因为前一个场景已验证可行。 - 链接器仅针对QSTrade类报告LNK1194错误,是仅该类存在问题,还是
c.dll中所有相关类都受影响但仅触发一个错误?
内容的提问来源于stack exchange,提问作者Atmo
相关产品推荐
相关产品推荐

