我一直试图在我的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
有没有人有任何想法?如果您需要更多详细信息,我会尽量让您尽可能彻底。感谢
汤姆
答案 0 :(得分:5)
我一直在努力应对类似的情况:qca-ossl在linux上构建得很好而在Windows上根本没有。我刚刚取得了一个可能对你有帮助的突破。
版本和补丁
首先,如果您使用的是OpenSsl的更新版本(我认为是0.9.7+),您可能需要使用存储库中的qca-ossl版本,因为它会修补一些不兼容性。我还需要在新的qca-ossl.cpp文件中注释掉处理SHA224,SHA256,SHA384和SHA512的一些行,以避免构建错误。我正在使用qca-ossl作为密码,所以我并不担心散列,也没有对这些错误进行过多的调查。
修复
Windows构建问题对我来说很多,但大多数都源于插件的Windows版本的伪劣版本设置。对于Linux方面有一点配置脚本很好,但是Windows呢?我们需要做一些额外的工作。
这项额外工作的一部分是因为我为我的应用程序的支持库选择了非标准位置。 Qca和OpenSsl都存在于库/目录中项目的目录结构中。我的猜测是,如果你试图交叉编译你的应用程序,你已经做了类似的事情,但即使你不这样做,也应该有所帮助。
查找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
比较了qix-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行并运行一个普通的'make'后,你需要安装Qca-ossl。您可以将生成的DLL从lib /目录复制到Qt的plugins目录,如果您使用的是我的版本,则默认为C:\ Qt \ 2010.05 \ qt \ plugins \ crypto。或者,您可以将其移动到加密目录,该目录位于项目目录结构的根级别,例如C:\ path \ to \ my \ project \ crypto。
我希望这有帮助!
答案 1 :(得分:0)
实际上,您可以尝试本教程QCA+OpenSSL on Window。它运作良好。
顺便说一句,我可以在Window上使用带有AES 256的QCA。但我无法在Symbian上使用它。有什么想法吗?