Qt5 - Windows:不一致的 dll 链接错误和 dllimport 静态数据成员的定义不允许

Posted

技术标签:

【中文标题】Qt5 - Windows:不一致的 dll 链接错误和 dllimport 静态数据成员的定义不允许【英文标题】:Qt5 - Windows : inconsistent dll linkage error and definition of dllimport static data member not allowed 【发布时间】:2019-12-09 21:12:40 【问题描述】:

我正在尝试使用Windows 10Qt5.12 构建一个项目。小程序使用smtp 协议可用here。我可以确认在我的Windows 上我有OpenSSL 1.1.1c 28 May 2019。 在我的Ubuntu 19.04 上,同样的程序像往常一样编译和运行,但在Windows 上却没有。

我附在错误的打印屏幕下方;然而,这些大多是两种类型:

1) inconsistent dll linkage

2) definition of dllimport static data member not allowed

在this link 之后,Windows 似乎需要其“自己的”包含(即#include <windows....),但在我的情况下,来自上述链接的smtp 库没有任何#include <windows> 并且不知道如果必须生成它们。我发现的帖子似乎不是他们

此外,我正在阅读this post too,因为我认为我可能有用,但没有任何信息可以帮助我解决问题

我挖了更多,实际上去了windows includes所在的位置,以下是我能够找到的路径,但不知道这是否有用:

从我红色的所有帖子来看,问题似乎是,在这种特定情况下,Windows .pro 文件已写入。在我的.pro 文件下方。 请注意,我将此存储库克隆到我的windows 10 中。

.pro

QT += quick quickcontrols2 concurrent network core gui

CONFIG += c++11

# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Refer to the documentation for the
# deprecated API to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

TARGET = SMTPEmail
TEMPLATE = lib
DEFINES += SMTP_BUILD
win32:CONFIG += dll


# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
        main.cpp \
        progressbardialog.cpp \
        robot.cpp \
        robotmanager.cpp \
        settings/emailaddress.cpp \
        settings/mimeattachment.cpp \
        settings/mimecontentformatter.cpp \
        settings/mimefile.cpp \
        settings/mimehtml.cpp \
        settings/mimeinlinefile.cpp \
        settings/mimemessage.cpp \
        settings/mimemultipart.cpp \
        settings/mimepart.cpp \
        settings/mimetext.cpp \
        settings/quotedprintable.cpp \
        settings/smtpclient.cpp \
        user.cpp \
        usermanager.cpp

RESOURCES += qml.qrc

# Additional import path used to resolve QML modules in Qt Creator's code model
QML_IMPORT_PATH =

# Additional import path used to resolve QML modules just for Qt Quick Designer
QML_DESIGNER_IMPORT_PATH =

HEADERS += \
    progressbardialog.h \
    robot.h \
    robotmanager.h \
    settings/SmtpMime \
    settings/emailaddress.h \
    settings/mimeattachment.h \
    settings/mimecontentformatter.h \
    settings/mimefile.h \
    settings/mimehtml.h \
    settings/mimeinlinefile.h \
    settings/mimemessage.h \
    settings/mimemultipart.h \
    settings/mimepart.h \
    settings/mimetext.h \
    settings/quotedprintable.h \
    settings/smtpclient.h \
    settings/smtpexports.h \
    user.h \
    usermanager.h

编辑

更具体地说,违规行的每个标题似乎都如下:

class SMTP_EXPORT EmailAddress : public QObject // <-- SMTP_EXPORT

这导致我在下面复制的 smtpexports.h

#ifndef SMTPEXPORTS_H
#define SMTPEXPORTS_H

#ifdef SMTP_BUILD
#define SMTP_EXPORT Q_DECL_EXPORT
#else
#define SMTP_EXPORT Q_DECL_IMPORT
#endif

#endif // SMTPEXPORTS_H

其他编辑

添加DEFINES += SMTP_BUILD 后几乎所有错误都解决了,但我还有两个错误,我在下面添加了一个打印屏幕:

非常感谢您指出如何解决此问题的正确方向。

【问题讨论】:

您在构建库时是否定义了SMTP_BUILD @Thomas,非常感谢您阅读这个问题。我不是Windows 用户,因为我主要使用Ubuntu。所以我想答案是否定的。我怎么做?我只git clone该文件夹并尝试运行它。 this 表示你可能做到了。 或许不是。看起来您没有通过 lib 而是添加了源文件。那么你概率。需要将DEFINES += SMTP_BUILD 行添加到您的.pro 文件中。 完成here 【参考方案1】:

这些文件被设计为使用define SMTP_BUILD 集进行编译,将源代码添加到库或可执行文件中。您必须添加

DEFINES += SMTP_BUILD

到您的pro 文件。

【讨论】:

以上是关于Qt5 - Windows:不一致的 dll 链接错误和 dllimport 静态数据成员的定义不允许的主要内容,如果未能解决你的问题,请参考以下文章

由于找不到qt5quick.dll,无法继续执行代码。重新安装程序可能会解决此问题,不知道怎么解决跪求大神帮忙

如何解决操作系统中丢失Qt5core.dll文件

不一致的 dll 链接和 dllimport 静态数据成员的定义不允许

电脑显示Qt5Core.dll 丢失

由于找不到qt5gui.dll,无法继续执行代码有影响吗

无法定位程序输入点_ZdaPvj于动态链接库 Qt5Core.dl Qt5Gui.dll上