我已经尝试了几天,在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要求插件以 Debug模式进行编译(以获取包含调试而不是发布的构建密钥),所以我添加了
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版本的伪劣构 build 置。拥有一些用于Linux方面的配置脚本真是太好了,但是Windows呢?我们需要做一些额外的工作。

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

    查找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"

    您应该能够使用反斜杠或正斜杠。由于Qt自4.7起已弃用它们,因此我在这里选择前进。

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

    查找Qca

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

    为避免这种情况,我们将需要手动明确定义包含和库路径。从最后一部分的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。

    我希望这有帮助!

    10-06 02:38