[原創(chuàng)]win10使用Qt6編譯Quazip手記

前言說(shuō)明

本文是作者在win10下使用Qt6編譯Quazip的過(guò)程記錄,旨在闡明過(guò)程中出現(xiàn)的問(wèn)題侣诺,已經(jīng)解決的思路和方法裆泳,不是直截了當(dāng)?shù)慕坛獭?br> 你可以在這里直接下載已經(jīng)改造完成的工程。

環(huán)境

· Win10
· CMake 3.23.0-rc2
· Qt Creator 6.0.2 Based on Qt 6.2.2 (MSVC 2019, 64 bit)

一次失敗的嘗試經(jīng)歷步驟

  1. Github下載最新的quazip-master 09ec1d1on 25 Jan
  2. 解壓到某個(gè)目錄糜芳,比如F:\tgit\lib\quazip-master\quazip-1.2.0
  3. 根據(jù)官網(wǎng)的文檔,執(zhí)行CMake千诬,結(jié)果失敗耍目,如下所示
(c) 2020 Microsoft Corporation. 保留所有權(quán)利。

C:\Users\fygame>F:

F:\>cd F:\tgit\lib\quazip-master\quazip-1.2.0

F:\tgit\lib\quazip-master\quazip-1.2.0>cmake -S . -B F:\tgit\qtprojects\quazip -D QUAZIP_QT_MAJOR_VERSION=6
-- Building for: Visual Studio 16 2019
CMake Warning at CMakeLists.txt:1 (project):
  VERSION keyword not followed by a value or was followed by a value that
  expanded to nothing.


CMake Error at CMakeLists.txt:1 (project):
  VERSION not allowed unless CMP0048 is set to NEW


CMake Warning (dev) in CMakeLists.txt:
  No cmake_minimum_required command is present.  A line of code such as

    cmake_minimum_required(VERSION 3.23)

  should be added at the top of the file.  The version specified may be lower
  if you wish to support older CMake versions for this project.  For more
  information run "cmake --help-policy CMP0000".
This warning is for project developers.  Use -Wno-dev to suppress it.

-- Configuring incomplete, errors occurred!

錯(cuò)誤出現(xiàn)在F:\tgit\lib\quazip-master\quazip-1.2.0\CMakeLists.txt的第一行徐绑,如下所示

project(QuaZip_Library VERSION ${QUAZIP_LIB_VERSION})

include(GNUInstallDirs) # configurable CMAKE_INSTALL_*DIR

提示如果要使用VERSION,必須把CMP0048設(shè)置為NEW莫辨,按照提示修改如下:

cmake_policy(SET CMP0048 NEW)
project(QuaZip_Library VERSION ${QUAZIP_LIB_VERSION})

include(GNUInstallDirs) # configurable CMAKE_INSTALL_*DIR

刪除緩存F:\tgit\qtprojects\quazip傲茄,重新執(zhí)行CMake命令:

F:\tgit\lib\quazip-master\quazip-1.2.0>cmake -S . -B F:\tgit\qtprojects\quazip -D QUAZIP_QT_MAJOR_VERSION=6
CMake Warning at CMakeLists.txt:2 (project):
  VERSION keyword not followed by a value or was followed by a value that
  expanded to nothing.


-- Selecting Windows SDK version 10.0.17763.0 to target Windows 10.0.19041.
-- The C compiler identification is MSVC 19.29.30140.0
-- The CXX compiler identification is MSVC 19.29.30140.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: D:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.29.30133/bin/Hostx64/x64/cl.exe - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: D:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.29.30133/bin/Hostx64/x64/cl.exe - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
CMake Error at CMakeLists.txt:49 (add_library):
  add_library ALIAS requires exactly one target argument.


CMake Error at CMakeLists.txt:51 (set_target_properties):
  set_target_properties called with incorrect number of arguments.


CMake Error at CMakeLists.txt:57 (target_include_directories):
  Cannot specify include directories for target "PUBLIC" which is not built
  by this project.


CMake Error at CMakeLists.txt:63 (target_link_libraries):
  target_link_libraries called with incorrect number of arguments


CMake Error at CMakeLists.txt:67 (target_compile_definitions):
  Cannot specify compile definitions for target "PUBLIC" which is not built
  by this project.


CMake Warning (dev) in CMakeLists.txt:
  No cmake_minimum_required command is present.  A line of code such as

    cmake_minimum_required(VERSION 3.23)

  should be added at the top of the file.  The version specified may be lower
  if you wish to support older CMake versions for this project.  For more
  information run "cmake --help-policy CMP0000".
This warning is for project developers.  Use -Wno-dev to suppress it.

-- Configuring incomplete, errors occurred!
See also "F:/tgit/qtprojects/quazip/CMakeFiles/CMakeOutput.log".

之前的報(bào)錯(cuò)沒(méi)有了,但是出現(xiàn)了更多的報(bào)錯(cuò)沮榜,根據(jù)提示盘榨,看看CMakeLists.txt的第49行:

add_library(QuaZip::QuaZip ALIAS ${QUAZIP_LIB_TARGET_NAME})

set_target_properties(${QUAZIP_LIB_TARGET_NAME} PROPERTIES
    VERSION ${QUAZIP_LIB_VERSION}
    SOVERSION ${QUAZIP_LIB_SOVERSION}
    OUTPUT_NAME ${QUAZIP_LIB_FILE_NAME}
    PUBLIC_HEADER "${QUAZIP_HEADERS}"
)

${QUAZIP_LIB_TARGET_NAME}這個(gè)變量并沒(méi)有賦值的地方,而且此類報(bào)錯(cuò)解決了一個(gè)應(yīng)該還會(huì)冒出來(lái)新的蟆融,感覺(jué)按照官方流程是走不通的草巡,可能不兼容Qt6,或者不兼容CMake 3.23.0-rc2型酥。換了個(gè)官方聲稱CMake minimum version 3.15 is required to build QuaZip 1.0.的CMake 1.0山憨,也是一堆問(wèn)題查乒,算了,不試了郁竟,決定另辟蹊徑玛迄。

第二次嘗試

上面編譯quazip-1.2.0失敗,于是按照這篇教程https://www.cnblogs.com/qiyawei/p/10695192.html棚亩,嘗試編譯quazip-0.7.3

  1. https://sourceforge.net/projects/quazip/下載quazip-0.7.3蓖议,解壓到F:\tgit\qtprojects\quazip-0.7.3
  2. 在Qt Creator打開(kāi)項(xiàng)目文件F:\tgit\qtprojects\quazip-0.7.3\quazip.pro
  3. 在子項(xiàng)目quazip/quazip.priqztest/qztest.pro文件中添加Qt安裝目錄下的QtZlib,如下圖所示:
    image.png

這里和上述那篇教程不同讥蟆,此處使用$$[QT_INSTALL_PREFIX]來(lái)獲得Qt安裝目錄勒虾,避免寫死本機(jī)絕對(duì)路徑,保證可移植性瘸彤。經(jīng)過(guò)測(cè)試修然,在WIN10下qmake對(duì)INCLUDEPATH的斜杠方向敏感,需要使用system_path將其轉(zhuǎn)換為windows路徑的反斜杠钧栖,否則編譯時(shí)找不到對(duì)應(yīng)的頭文件低零。

  1. 右鍵點(diǎn)擊子項(xiàng)目quazip,選擇構(gòu)建"quazip"拯杠,或者點(diǎn)擊菜單構(gòu)建>Build Subproject "quazip"掏婶,出現(xiàn)一堆報(bào)錯(cuò)
    image.png

    報(bào)錯(cuò)的原因是這個(gè)項(xiàng)目是在Qt5環(huán)境下編寫的,很多類型在Qt6已經(jīng)無(wú)法直接使用潭陪。

關(guān)于QTextCodec的報(bào)錯(cuò)

F:\tgit\qtprojects\quazip-0.7.3\quazip\quazip.h:30: error: C1083: 無(wú)法打開(kāi)包括文件: “QTextCodec”: No such file or directory

查看Qt官網(wǎng)這個(gè)類的介紹:

image.png

我用的是qmake雄妥,因此在F:\tgit\qtprojects\quazip-0.7.3\quazip\quazip.pro中添加一行QT += core5compat,如下圖所示
image.png

重新構(gòu)建依溯,提示

:-1: error: Unknown module(s) in QT: core5compat

這是因?yàn)槲覜](méi)有安裝組件老厌,打開(kāi)Qt安裝目錄下的MaintenanceTool.exe

image.png

· 使用賬號(hào)密碼登錄
· 選擇“添加或移除組件”
· 勾選Qt 5 Compatibility Module
image.png

安裝后重啟Qt,重新構(gòu)建黎炉,一般都可以解決枝秤。
但是我出現(xiàn)了一個(gè)新的錯(cuò)誤:-1: error: Unknown module(s) in QT: core5compat
image.png

這猜測(cè)這是因?yàn)槲抑笆褂玫氖?code>Qt6.2.3,而它已被6.2.4所取代慷嗜,我在添加組件時(shí)找不到6.2.3對(duì)應(yīng)的組件淀弹,所以我安裝了6.2.4的組件,看來(lái)這樣Qt識(shí)別不出來(lái)庆械∞崩#看來(lái)我只能把版本升級(jí)到6.2.4了。

修改Qt引擎版本

繼續(xù)使用MaintenanceTool.exe安裝6.2.4的相關(guān)組件缭乘,安裝好之后沐序,重啟Qt,打開(kāi)菜單工具>選項(xiàng)>Kits>Qt Versions

image.png

可以看到Qt已經(jīng)自動(dòng)檢測(cè)到6.2.4
image.png

再選中左側(cè)的項(xiàng)目策幼,右鍵Desktop Qt 6.2.4 MSVC2019 64bit邑时,將其enable并雙擊,此時(shí)可以看到構(gòu)建套件已經(jīng)出現(xiàn)了6.2.4垄惧,并觸發(fā)了自動(dòng)編譯刁愿,關(guān)于QT: core5compat的報(bào)錯(cuò)也消失了。
由此說(shuō)明到逊,因Qt存在多個(gè)版本铣口,選擇哪個(gè)版本應(yīng)當(dāng)小心,來(lái)看看我當(dāng)初安裝的6.2.3說(shuō)明:
image.png

6.2.3并不是終版觉壶,終將被6.2.4所代替脑题。因此,6.2.4出來(lái)后铜靶,你就沒(méi)辦法再安裝6.2.3的組件了叔遂。

關(guān)于tfUtf8的報(bào)錯(cuò)

F:\tgit\qtprojects\quazip-0.7.3\quazip\quagzipfile.cpp:60: error: C2039: "trUtf8": 不是 "QuaGzipFile" 的成員
F:\tgit\qtprojects\quazip-0.7.3\quazip\quagzipfile.h(39): note: 參見(jiàn)“QuaGzipFile”的聲明

改成QObject::tr對(duì)應(yīng)的QuaGzipFile::tr即可

關(guān)于Permissions的報(bào)錯(cuò)

F:\tgit\qtprojects\quazip-0.7.3\quazip\quazipfileinfo.cpp:29: error: C2440: “初始化”: 無(wú)法從“int”轉(zhuǎn)換為“QFlags<QFileDevice::Permission>”

把下圖中的QFile::Permissions perm = 0;


改成QFile::Permissions perm = QFile::Permissions();
image.png

關(guān)于created的報(bào)錯(cuò)

F:\tgit\qtprojects\quazip-0.7.3\quazip\quazipnewinfo.cpp:137: error: C2039: "created": 不是 "QFileInfo" 的成員
D:\Qt\6.2.3\msvc2019_64\include\QtCore\qfileinfo.h(56): note: 參見(jiàn)“QFileInfo”的聲明

把下圖中的setFileNTFScTime(fi.created());

image.png

改成setFileNTFScTime(fi.birthTime());
image.png

關(guān)于qSort的報(bào)錯(cuò)

F:\tgit\qtprojects\quazip-0.7.3\quazip\quazipdir.cpp:393: error: C3861: “qSort”: 找不到標(biāo)識(shí)符
..\..\quazip-0.7.3\quazip\quazipdir.cpp(393): note: “qSort”: 函數(shù)聲明必須可用,因?yàn)樗袇?shù)都不依賴于模板參數(shù)
..\..\quazip-0.7.3\quazip\quazipdir.cpp(44): note: 此診斷出現(xiàn)在編譯器生成的函數(shù)“bool QuaZipDirPrivate::entryInfoList(QStringList,QDir::Filters,QDir::SortFlags,TFileInfoList &) const”中

查看官方文檔争剿,qSort這個(gè)函數(shù)只是為了兼容以前老的代碼已艰,Qt6現(xiàn)已廢棄,需要換成std::qsort蚕苇。

image.png

修改辦法是包裝一個(gè)lambda表達(dá)式來(lái)使用現(xiàn)有的QuaZipDirComparator哩掺,如下圖所示:

image.png

然而,這樣修改改動(dòng)有點(diǎn)大涩笤,有沒(méi)有辦法簡(jiǎn)單地修改一下呢嚼吞?既然std::qsort是為了兼容老的代碼,那就直接把它換成std::sort吧蹬碧,直接把qSort(list.begin(), list.end(), lessThan);這句代碼改成std::sort(list.begin(), list.end(), lessThan);即可舱禽。如下圖所示:
image.png

同樣的道理,在子項(xiàng)目qztest中恩沽,把qSort(xxx);之類的語(yǔ)句誊稚,改成std::sort(xxx.begin(), xxx.end())

其他報(bào)錯(cuò)

F:\tgit\qtprojects\quazip-0.7.3\quazip\quazipdir.cpp:393: error: C3861: “qSort”: 找不到標(biāo)識(shí)符
..\..\quazip-0.7.3\quazip\quazipdir.cpp(393): note: “qSort”: 函數(shù)聲明必須可用罗心,因?yàn)樗袇?shù)都不依賴于模板參數(shù)
..\..\quazip-0.7.3\quazip\quazipdir.cpp(44): note: 此診斷出現(xiàn)在編譯器生成的函數(shù)“bool QuaZipDirPrivate::entryInfoList(QStringList,QDir::Filters,QDir::SortFlags,TFileInfoList &) const”中

return compressDir(fileCompressed, dir, recursive, 0);改為return compressDir(fileCompressed, dir, recursive, QDir::Filters());
QString::SkipEmptyParts改為Qt::SkipEmptyParts
qrand換成QRandomGenerator片吊,詳見(jiàn)qrandQRandomGenerator
toTime_t換成toSecsSinceEpoch协屡,詳見(jiàn)QDateTime::toTime_t

編譯成功

以上改完后就可以成功編譯了,可以看到生成了對(duì)應(yīng)的dll和lib文件全谤。


image.png

參考資料

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末肤晓,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌补憾,老刑警劉巖漫萄,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異盈匾,居然都是意外死亡腾务,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門削饵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)岩瘦,“玉大人,你說(shuō)我怎么就攤上這事窿撬∑裘粒” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵劈伴,是天一觀的道長(zhǎng)密末。 經(jīng)常有香客問(wèn)我,道長(zhǎng)跛璧,這世上最難降的妖魔是什么严里? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮追城,結(jié)果婚禮上刹碾,老公的妹妹穿的比我還像新娘。我一直安慰自己漓柑,他們只是感情好教硫,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著辆布,像睡著了一般瞬矩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上锋玲,一...
    開(kāi)封第一講書(shū)人閱讀 51,182評(píng)論 1 299
  • 那天景用,我揣著相機(jī)與錄音,去河邊找鬼惭蹂。 笑死伞插,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的盾碗。 我是一名探鬼主播媚污,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼廷雅!你這毒婦竟也來(lái)了耗美?” 一聲冷哼從身側(cè)響起京髓,我...
    開(kāi)封第一講書(shū)人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎商架,沒(méi)想到半個(gè)月后堰怨,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蛇摸,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年备图,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赶袄。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡揽涮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出弃鸦,到底是詐尸還是另有隱情绞吁,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布唬格,位于F島的核電站家破,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏购岗。R本人自食惡果不足惜汰聋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望喊积。 院中可真熱鬧烹困,春花似錦、人聲如沸乾吻。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)绎签。三九已至枯饿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間诡必,已是汗流浹背奢方。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留爸舒,地道東北人蟋字。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像扭勉,于是被迫代替她去往敵國(guó)和親鹊奖。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容