目錄
1.環境和工具
2.CMake編譯
3.查找依賴文件
3.1.windeployqt
3.2.dumpbin
4.總結
相關鏈接
QSimpleUpdater:解鎖 Qt 應用自動更新的全新姿勢-CSDN博客
1.環境和工具
windows 11, x64
Qt5.12.12或Qt5.15.2
CMake 4.0.2?
干凈的windows 7,最好是用windows7的iso安裝出來的
虛擬機VirtualBox
Everything
2.CMake編譯
進入QSimpleUpdater的源碼目錄,新建build文件夾:
進入build目錄,執行命令:
cmake ../
出現報錯,需要設置一下Qt的目錄,因為cmake找不到Qt在哪里,配置并重新執行命令:
生成VS2022工程成功
你可以用VS2022打開QSimpleUpdater.sln工程,全部編譯就會生成庫文件和測試執行文件,當然也可以直接用CMake去編譯,如下:
于是在build目錄下的Release中生成了目標文件:
直接運行UnitTests.exe出現:
3.查找依賴文件
3.1.windeployqt
在命令行模式進入C:\Qt\5.12.12\msvc2019_64\bin,然后運行:
然后在UnitTests.exe的目錄下查找到Qt的庫依賴:
從截圖可以看到,用這個工具只能查找Qt的依賴,系統的一些依賴是不能打包進去的
然后把這個程序打包放到干凈的win7下面運行報錯:
說明安裝包里面少了一些依賴庫。
3.2.dumpbin
????????Dumpbin是Windows環境下用于分析可執行文件內部結構的命令行工具,由Microsoft Visual C++提供。它能夠揭示二進制文件的詳細內容,如導出函數、導入函數、資源等,特別有助于調試DLL。主要功能包括:
- 查看文件頭信息:包含 PE 文件結構、子系統、DLL 特性等
- 分析導出表:列出 DLL 中導出的函數和變量
- 分析導入表:顯示程序依賴的外部函數和 DLL
- 依賴分析:檢查二進制文件依賴的所有動態鏈接庫
- 符號表查看:顯示 COFF 符號表信息,用于調試和鏈接分析
- 資源查看:查看二進制文件中包含的資源(圖標、菜單、字符串等)
dumpbin.exe在vs2022的安裝目錄下"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin"
從開始進去中的Visual Studio 2022菜單下:
在命令行中輸入dumpbin會出現:
繼續在命令行中輸入:
可以看到UnitTests.exe的依賴庫,可以看到除了Qt的庫外還有一些系統的庫,通過Everything軟件查找的庫大致在兩個地方:
依次從這兩個目錄中把上面依賴的文件拷貝到打包目錄中,然后打包,再把打包的程序放在win7上面去運行:
還是報錯誤,找不到MSVCP140.dll,于是又在原來的電腦上查找庫MSVCP140.dll,拷貝到win7上
拷貝MSVCP140.dll到win7上運行程序:
報錯了,程序崩潰了。
在網上查找了一下原因:
0xc000007b:
表示 “應用程序無法正常啟動”,通常是因為缺少 UCRT 或運行時庫。0xc0000135:
表示 “找不到 DLL”,需檢查依賴的 DLL 是否在系統中存在。
于是又把目錄C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\IDE\Remote Debugger\x64目錄里面的文件全部拷貝過去,把比較明顯不需要的刪掉。
拷貝到win7,運行,報如下錯誤:
還是缺少msvcp140_1.dll,于是查找到該文件:
拷貝到win7,運行:
終于可以運行,正常輸出結果了!!!
4.總結
1.在windows發布程序,一定要在一個干凈的環境下去測試程序是否能運行,比如win7,如果在干凈的win7能運行,那基本上在win7之后的版本應該都能運行。
2.查找程序依賴,vs2022編譯出來的程序,依賴的庫一般都去vs2022的安裝目錄里面去找,會比較快。
3.好好的利用Everything工具,用它查找真是快。
相關鏈接
- CMake 官網?https://cmake.org/
- CMake 官方文檔:https://cmake.org/cmake/help/latest/guide/tutorial/index.html
- CMake 源碼:https://github.com/Kitware/CMake
- CMake 源碼 :?CMake · GitLab
- 中文版基礎介紹:?CMake 入門實戰 | HaHack
- wiki:?Home · Wiki · CMake / Community · GitLab