【问题标题】:Qt library link errors in WindowsWindows 中的 Qt 库链接错误
【发布时间】:2018-10-08 10:23:45
【问题描述】:

项目在 Linux 上构建良好,但在 Windows 中链接有问题。

第一期:

LNK2019: unresolved external symbol ...
LNK1120: 21 unresolved externals

.pro 文件包含:

isEmpty(IDE_BUILD_TREE): IDE_BUILD_TREE = ../../qt-creator-debug
LIBS += -L$${IDE_BUILD_TREE}/lib/qtcreator/plugins -lMyLibrary

注意。 MyLibrary 在构建之前部署到 $${IDE_BUILD_TREE}/lib/qtcreator/plugins。使用 Qt 5.10.1 和 MSVC 2015 构建。

这里有什么问题/技巧?如何解决?


第二期:

在库.pro 文件VERSION 中定义了变量,结果库的名称为MyLibrary1.lib。此后我得到错误:

:-1: error: LNK1181: cannot open input file 'MyLibrary.lib'

这里有什么更好的解决问题的方法:删除VERSION 或修复.pro 文件?怎么样?


第三期:

另一个链接错误:

mydialog.obj:-1: error: LNK2001: unresolved external symbol 
"struct QMetaObject const MyLibrary::staticMetaObject" 
(?staticMetaObject@MyLibrary@@3UQMetaObject@@B)

由于以下代码行发生错误(注释掉时消失):

mydialog.cpp:

    QMetaEnum myEnum = QMetaEnum::fromType<MyLibrary::MyEnumClass>();

mylibrary.h:

namespace MyLibrary {

Q_NAMESPACE

enum class MYLIBRARYSHARED_EXPORT MyEnumClass {
...
};

Q_ENUM_NS(MyEnumClass)
...
} // namespace MyLibrary

第三个怎么解决?

【问题讨论】:

    标签: c++ windows qt linker-errors qmake


    【解决方案1】:

    第一个问题修复:

    我的错:由于某些类的声明中缺少MYLIBRARYSHARED_EXPORT而导致的错误,在全局标题中定义为:

    #if defined(MYLIBRARY_LIBRARY)
    #  define MYLIBRARYSHARED_EXPORT Q_DECL_EXPORT
    #else
    #  define MYLIBRARYSHARED_EXPORT Q_DECL_IMPORT
    #endif
    

    没有MYLIBRARYSHARED_EXPORT 在 Linux 和 Mac 中构建良好,但在 Windows 中失败。


    第二个问题修复:

    可能的解决方案 - 添加到 .pro 文件行:

    win32:CONFIG += skip_target_version_ext
    

    win32:TARGET_EXT = .dll 
    

    在 Windows 上设置没有主要版本号的输出文件名。但是我看到,例如,Qt Creator 插件链接库与主要版本号没有问题。如何做到这一点?


    第三个问题修复:

    还需要在 Q_NAMESPACE 声明前加上 MYLIBRARYSHARED_EXPORT

    namespace MyLibrary {
    
    MYLIBRARYSHARED_EXPORT Q_NAMESPACE
    
    enum class MYLIBRARYSHARED_EXPORT MyEnumClass {
    ...
    };
    
    Q_ENUM_NS(MyEnumClass)
    ...
    } // namespace MyLibrary
    

    【讨论】:

    • @PatrickParker 我将在获得更多信息时扩展并完成答案。刚刚添加了注释以保留第一个问题解决的有用信息。
    • @PatrickParker OP 没有在他的帖子中添加信息 - 他只是给出了部分答案。我为这个投票“看起来不错”,因为这是回答问题的实际尝试。
    • 好的,“我的错”这句话听起来像是您在问题本身上犯了一个错误。那里可能是一个糟糕的词选择。
    • @AlekseyKontsevich 谢谢,第三次修复是我的解决方案。
    猜你喜欢
    • 2020-12-10
    • 1970-01-01
    • 1970-01-01
    • 2013-06-03
    • 1970-01-01
    • 1970-01-01
    • 2015-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多