4

几天来,我一直在尝试在我的 Windows PC 上使用 QCA ( Link ),在我的 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

有没有人有任何想法?如果您需要更多详细信息,请询问,我已尝试尽可能彻底。谢谢

汤姆

4

2 回答 2

5

我一直在为类似的情况而苦苦挣扎:qca-ossl 在 linux 上构建良好,而在 Windows 上则完全不行。我刚刚取得了一个突破,这也可能对您有所帮助。

版本和补丁

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

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

修复它

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

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

寻找 OpenSsl

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

您应该能够使用反斜杠或正斜杠。在这里,我选择向前,因为 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\to\my\project\crypto。

我希望这有帮助!

于 2011-02-24T16:18:45.040 回答
0

实际上,您可以在 Window 上尝试本教程 QCA+OpenSSL。它运作良好。

顺便说一句,我可以在 Window 上使用带有 AES 256 的 QCA。但是我不能在 Symbian 上使用它。有什么想法吗?

相关帖子

于 2011-11-02T02:58:27.097 回答