在Windows 7上安装QCA-OSSL(Qt加密体系结构的一部分)插件时出现问题

ora*_*cal 4 c++ plugins qt qmake mingw32

我一直试图在我的Windows PC上使用QCA(Link)几天,在我的linux机箱上运行正常,只是无法使用Windows.

所以我按照安装QCA的所有说明,然后是QCA的ossl插件.QCA工作正常,但由于某种原因,插件没有出现在我的Qt Creator中,也无法使用插件中的某些功能.

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

qcatool2 plugins --debug
Run Code Online (Sandbox Code Playgroud)

并收到此错误消息:

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
Run Code Online (Sandbox Code Playgroud)

到我的插件的项目文件并像往常一样运行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
Run Code Online (Sandbox Code Playgroud)

有没有人有任何想法?如果您需要更多详细信息,我会尽量让您尽可能彻底.谢谢

汤姆

per*_*den 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版本,因为它修补了一些不兼容性.我还需要在新的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
}
}
Run Code Online (Sandbox Code Playgroud)

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

qmake.exe "OPENSSL_PREFIX=C:/path/to/openssl-1.0.0b"
Run Code Online (Sandbox Code Playgroud)

您应该能够使用反斜杠或正斜杠.在这里我选择了前进,因为Qt自4.7以来已经弃用它们.

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

寻找Qca

在比较unix和windows makefile for qca-ossl之后,奇怪的是,它从未包含用于构建或链接的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"
Run Code Online (Sandbox Code Playgroud)

"安装"Qca-ossl

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

我希望这有帮助!