QCA 2.1.0在Windows上用MinGW的编译过程

QCA是Qt Cryptographic Architecture的缩写,简而言之就是安全组件(如OpenSSL)的Qt封装,方便Qt程序调用,而不用写一大串C代码。QCA自然是开源的,而且好像是KDE的一个project(反正代码是在KDE的git服务器上)。

时隔四年,QCA总算发布了新版本,虽然是小版本号的变化(2.0.3 -> 2.1.0),但却是非常重要的更新!!!首先支持使用Qt5了,其次使用CMake而不是qmake来管理了。如果不支持Qt5的话,我也不会关心QCA的…………

但是目前主流Linux发行版的官方仓库还是2.0.3版的QCA,而且这次也没有Windows builds下载,只有源码包,好在编译不太麻烦,下面就记录了本次编译的过程(环境:Windows 8.1 x64 Pro, MinGW64 4.9.1 x64, MSYS, Qt 5.3.2 x64 static, OpenSSL 1.0.1j x64 static, CMake 3.1.0)。这次要编译的就是静态链接的QCA,如果你要编译动态链接的QCA,上面的工具链必须也是动态链接的!

首先下载QCA-2.1.0源码包,随便解压到哪里。打开MSYS,先把qmake加入到PATH中:

export PATH=$PATH:/d/Qt/Qt5.3.2/5.3/mingw491_64_static/bin

注意:如果你要编译静态链接库,你得先自己去编译一个静态链接的Qt

然后cd进入qca的源码目录,执行

mkdir build && cd build
cmake -G "MSYS Makefiles" \
-DOPENSSL_INCLUDE_DIR=/usr/local64/include/ \
-DBUILD_TESTS=OFF \
-DBUILD_SHARED_LIBS=OFF \
-DUSE_RELATIVE_PATHS=ON \
-DCMAKE_INSTALL_PREFIX=/usr/local64/qca \
..

cmake的第一个参数是指定使用MSYS的Makefile,不然在Windows下CMake会用NMake(Visual Studio的那个),下面依次是指定OpenSSL的include目录(该include下应有openssl文件夹);关闭测试;编译静态链接库;使用相对位置(编译为relocatable package);指定安装位置。

不知道是不是之前Qt编译的问题,我必须修改D:\Qt\Qt5.3.2\5.3\mingw491_64_static\lib\cmake\Qt5Network下Qt5Network_QGenericEnginePlugin.cmake和Qt5Network_QNativeWifiEnginePlugin.cmake文件,把所有像bearer/qgenericbearer.lib的字串改成bearer/libqgenericbearer.a(.lib改成.a,前面加个lib)。不然Qt自己宏检查文件会提示文件不存在而报错。

没问题就可以执行make了,静等几分钟然后make install就好了!

P.S. 不知道为何这样编译出来的QCA在linking阶段会失败,一大堆的undefined reference,原因未知。正在尝试换用MSVC编译

P.P.S. QCA 2.1.0不能静态链接编译,目前只能动态链接,静态就出错。Bugtracker

7 responses to “QCA 2.1.0在Windows上用MinGW的编译过程”

  1. babypig177 avatar
    babypig177

    你好,我之前没有用过MSYS2,MSYS,现在编译,只有CMAKE能过,其他的MAKE就提示不存在此命令,没有MAKEFILE,是不是我哪里配置不对啊?能给个详细点的么?

  2. xenotheme avatar
    xenotheme

    ss-qt 的静态链接单文件很好用。我也希望自己写的 qt 程序可以静态链接成单文件。但是 Qt 5 的 windows deploy 页面写着需要重源码编译静态链接版的 qt , 于是 VS2013 x64 Native Tools Command Prompt 下面 SET QMAKESPEC=win32-msvc2013
    configure -static -developer-build -opensource -nomake examples -nomake tests ,然后 nmake 的时候出错 :

    d:\qt\qt-everywhere-opensource-src-5.5.0\qtbase\src\3rdparty\harfbuzz\src\harfbu
    zz-thai.c : warning C4819: The file contains a character that cannot be represen
    ted in the current code page (936). Save the file in Unicode format to prevent d
    ata loss
    NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio 12.0
    \VC\BIN\cl.EXE"' : return code '0x2'

    请问 librehat 遇到过类似情况吗,谢谢!

    1. librehat avatar

      额,你的评论和文章不相关吧。
      我用MinGW/GCC编译的,所以没有遇到你的这个问题,可能是VS2013的个别问题?
      不过我今天编译Qt 5.5的结果有点奇怪,很多feature都莫名奇妙没了,所以还留在Qt 5.4.2

      1. xenotheme avatar
        xenotheme

        抱歉:p 我 Google 之后没有发现类似问题,在此站内搜索似乎也没有找到 ss qt 编译之类的文章,就找了一个看似近似的留言了,都是 qt 系编译方面。毕竟原作者可能是最有经验最有可能一次解决问题的人。细小的地方还请别太在意…
        按照 nmake 提示去看了那个文件是UTF8 编码,nmake 抑制警告作为错误的选项也不好用,看来我也得学着用 mingw了,既然qt 支持跨OS,却又不好用 native 工具链,总觉得哪里有点怪怪的 :)5.4.2 我也去试试。

        1. librehat avatar

          VS编译应该也是可以的,我记得之前用VS2013编译过Qt没有问题的。你试试5.4.2看看行不行吧。如果还不行的话就只能建议改用MinGW/GCC来编译了,因为我现在没有VS了,所以不能帮忙测试再写个教程什么的。
          如果MinGW/GCC还没搞出来,我改天抽空写个我的编译过程。

          1. xenotheme avatar
            xenotheme

            十分感谢!我最后用 msys2 内含的 Qt 编译,成功得到了单文件,按照的是 https://wiki.qt.io/MSYS2 的 Obtain Pre-Built 部分。您可以节约时间不用写教程了 :)

          2. librehat avatar

            还多亏你留言,我都不知道有MSYS2这个东西!还一直在用老旧的MSYS编译的。恩,成功了就好了!