我一直在尝试使用QCA(关联)在我的 Windows PC 上已经使用了几天了,在我的 Linux 机器上运行良好,只是无法在 Windows 上运行。

所以我遵循了安装 QCA 的所有说明,然后安装了 QCA 的 ossl 插件。QCA 工作正常,但由于某种原因,该插件没有显示在我的 Qt Creator 中,我也无法使用该插件中的某些功能。

我使用 QCA 附带的 qcatool2.exe 来检查我的插件

qcatool2 plugins --debug

并收到此错误消息:

plugin: qca-ossl2.dll: failed to load: The plugin 'C:/Qt/2010.05/qt/plugins/crypto/qca-ossl2.dll' uses incompatible Qt library. Expected build key "Windows mingw debug full-config", got "Windows mingw release full-config"

现在在我看来,好像 qt 需要在调试模式下编译插件(以便让构建密钥包含调试而不是发布),所以我添加了

CONFIG += debug

到我的插件的项目文件并像往常一样运行 qmake 和 mingw32-make 但这似乎没有效果。

我的插件项目文件现在是:

TEMPLATE = lib
CONFIG += plugin
QT -= gui
DESTDIR = lib

VERSION = 2.0.0

unix:include(conf.pri)
windows:CONFIG += crypto
windows:include(conf_win.pri)

CONFIG += create_prl

SOURCES = qca-ossl.cpp

windows:{
load(winlocal.prf)
isEmpty(WINLOCAL_PREFIX) {
error("WINLOCAL_PREFIX not found. See http://delta.affinix.com/platform/#winlocal")
}

OPENSSL_PREFIX = $$WINLOCAL_PREFIX
DEFINES += OSSL_097

INCLUDEPATH += $$OPENSSL_PREFIX/include
LIBS += -L$$OPENSSL_PREFIX/lib
LIBS += -llibeay32 -lssleay32
LIBS += -lgdi32 -lwsock32
}

!debug_and_release|build_pass {
CONFIG(debug, debug|release) {
mac:TARGET = $$member(TARGET, 0)_debug
windows:TARGET = $$member(TARGET, 0)d
}
}

CONFIG += debug

有人有什么想法吗?如果您需要更多详细信息,请询问,我已尽力尽可能详细。谢谢

汤姆

有帮助吗?

解决方案

我一直在为类似的情况而苦苦挣扎:qca-ossl 在 Linux 上构建得很好,但在 Windows 上根本不行。我刚刚取得了突破,这也可能对你有帮助。

版本和补丁

  • qtsdk-2010.05
  • qca-2.0.3
  • qca-ossl-r1190163(来自存储库)
  • openssl-1.0.0b

首先,如果您使用的是 OpenSsl 的较新版本(我认为是 0.9.7+),您可能需要使用存储库中的 qca-ossl 版本,因为它修复了一些不兼容性。我还需要注释掉新的 qca-ossl.cpp 文件中处理 SHA224、SHA256、SHA384 和 SHA512 的一些行,以避免构建错误。我使用 qca-ossl 作为密码,所以我不担心散列,也没有太多调查错误。

修复它

Windows 构建问题对我来说有很多,但其中大多数源于 Windows 版本插件的劣质构建设置。为 Linux 端提供一些配置脚本很好,但是 Windows 端呢?我们需要做一些额外的工作。

其中一些额外工作是因为我为应用程序的支持库选择了非标准位置。Qca 和 OpenSsl 都存在于项目目录结构中的libraries/目录中。我的猜测是,如果您尝试交叉编译应用程序,您已经做了类似的事情,但即使您没有这样做,以下内容也应该有所帮助。

寻找 OpenSSL

如果 Qca-ossl 找不到它应该连接的库,它就不会构建得很好......:) 所以让我们直接指定它在哪里。注释掉与 winlocal.prf 相关的行以及 qca-ossl.pro 中由此产生的更改。我们将直接指定在哪里可以找到 openSsl。

TEMPLATE = lib
CONFIG += plugin
QT -= gui
DESTDIR = lib

VERSION = 2.0.0

unix:include(conf.pri)
windows:CONFIG += crypto
windows:include(conf_win.pri)

CONFIG += create_prl

SOURCES = qca-ossl.cpp

windows:{
# Rather than rely on the winlocal.prf file, we will specify the location of the openssl
# by hand when running qmake.
#
# load(winlocal.prf)
# isEmpty(WINLOCAL_PREFIX) {
# error("WINLOCAL_PREFIX not found. See http://delta.affinix.com/platform/#winlocal")
# }
#
# OPENSSL_PREFIX = $$WINLOCAL_PREFIX
DEFINES += OSSL_097

INCLUDEPATH += $$OPENSSL_PREFIX/include
LIBS += -L$$OPENSSL_PREFIX/lib
LIBS += -llibeay32 -lssleay32
LIBS += -lgdi32 -lwsock32
}

!debug_and_release|build_pass {
CONFIG(debug, debug|release) {
mac:TARGET = $$member(TARGET, 0)_debug
windows:TARGET = $$member(TARGET, 0)d
}
}

现在我们可以直接访问 .pro 文件中的 $$OPENSSL_PREFIX 环境变量。我们可以在调用 qmake 时通过执行以下操作来设置它。

qmake.exe "OPENSSL_PREFIX=C:/path/to/openssl-1.0.0b"

您应该能够使用反斜杠或正斜杠。这里我选择forward,因为Qt从4.7开始就弃用了它们。

或者,您可以直接在 .pro 文件中设置 OPENSSL_PREFIX 变量。

寻找Qca

在比较 qca-ossl 的 unix 和 windows makefile 后,奇怪的是,它从未包含用于构建或链接的 qca 库!?!?!这导致 qca-ossl.cpp 末尾的 opensslPlugin 类定义的 Q_INTERFACES(QCAPlugin) 行出现“未定义接口”错误。

为了避免这种情况,我们需要手动显式定义包含路径和库路径。扩展上一节中的 qmake 行,最终的 qmake 行如下所示。

qmake.exe "OPENSSL_PREFIX=C:/path/to/openssl-1.0.0b" "INCLUDEPATH+=C:/path/to/qca-2.0.3/include/QtCrypto" "LIBS+=-LC:/path/to/qca-2.0.3/lib -lqca2"

“安装”Qca-ossl

运行上面的 qmake 行并运行普通的 ol' make 后,您需要安装 Qca-ossl。您可以将生成的 dll 从 lib/ 目录复制到 Qt 的插件目录,如果您使用我的版本,则该目录默认为 C:\Qt\2010.05\qt\plugins\crypto。或者,您可以将其移动到项目目录结构根级别的加密目录,例如 C:\path o\my\project\crypto。

我希望这有帮助!

其他提示

其实,你可以试试这个教程的 QCA + OpenSSL的上窗口。它的工作做好。

顺便说,我可以利用QCA的与窗口AES 256。但我不能用它在Symbian上。任何想法做呢?

相关邮

scroll top