CMake實踐: 以開源庫QSimpleUpdater為例,詳細講解編譯、查找依賴等全過程

目錄

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。主要功能包括:

  1. 查看文件頭信息:包含 PE 文件結構、子系統、DLL 特性等
  2. 分析導出表:列出 DLL 中導出的函數和變量
  3. 分析導入表:顯示程序依賴的外部函數和 DLL
  4. 依賴分析:檢查二進制文件依賴的所有動態鏈接庫
  5. 符號表查看:顯示 COFF 符號表信息,用于調試和鏈接分析
  6. 資源查看:查看二進制文件中包含的資源(圖標、菜單、字符串等)

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/87090.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/87090.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/87090.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

WordToCard制作高考志愿填報攻略小卡片【豆包版】

一、什么是WordToCard WordToCard是一個免費的工具,能夠將Word文檔自動轉換為美觀的知識卡片或圖文海報。以下是它的主要特點: 功能優勢 格式支持:支持標題、列表、表格、LaTeX公式等多種格式。模板豐富:提供多種風格的模板&am…

什么是PostCSS

PostCSS是一個用 JavaScript 工具和插件轉換 CSS 代碼的工具 PostCSS是基于 JavaScript 的 CSS 轉換引擎,通過插件系統對 CSS 進行現代化處理,PostCSS 不是預處理器,而是 CSS 的編譯器工具鏈,如同 Babel 之于 JavaScript&#xf…

游戲引擎學習第315天:取消排序鍵的反向順序

倉庫:https://gitee.com/mrxiao_com/2d_game_8 必須保證代碼能跟上不然調試很麻煩 回顧并為今天定調 目前正處于對引擎中 Z 軸處理方式進行修改的階段。上次我們暫停在一個節點,當時我們希望不再讓所有屏幕上的精靈都必須通過同一個排序路徑進行排序。我們想要將…

MySQL EXPLAIN 詳解

MySQL EXPLAIN 詳解:掌握 SQL 性能優化的關鍵工具 在日常數據庫開發和優化過程中,很多開發者會遇到 SQL 查詢變慢、索引未命中等問題。MySQL 提供了一個非常實用的工具 —— EXPLAIN 關鍵字,它可以幫助我們分析 SQL 查詢的執行計劃,識別潛在的性能瓶頸,從而有針對性地進行…

k8s使用私有harbor鏡像源

前言 在node上手動執行命令可以正常從harbor拉取鏡像,但是用k8s不行,使用kubectl describe pods xxx 提示未授權 unauthorized to access repository。 處理方法 創建一個secrete資源對象。以下示例中 registry-harbor 為secret資源對象的名稱。除了郵…

AI繪畫能發展到企業大規模使用的地步么?

1 技術演進與當前成熟度 AI繪畫技術經歷了從實驗室概念到商業級工具的蛻變過程。早期技術受限于模型坍縮等問題,難以滿足商業需求。關鍵突破出現在新型生成模型的應用,大幅提升生成速度至30秒內,在畫面邏輯性和風格多樣性方面實現質的飛躍。…

使用MyBatis-Plus實現數據權限功能

什么是數據權限 數據權限是指系統根據用戶的角色、職位或其他屬性,控制用戶能夠訪問的數據范圍。與傳統的功能權限(菜單、按鈕權限)不同,數據權限關注的是數據行級別的訪問控制。 常見的數據權限控制方式包括: 部門數…

大模型——Dify 與 Browser-use 結合使用

大模型——Dify 與 Browser-use 結合使用 Dify 與 Browser-use 的結合使用,能夠通過 AI 決策與自動化交互的協同,構建智能化、場景化的業務流程。 以下是兩者的整合思路與技術落地方案: 一、核心組合邏輯 分工定位 Dify:作為AI模型調度中樞,負責自然語言理解、決策生成、…

transformer demo

import torch import torch.nn as nn import torch.nn.functional as F import math import numpy as np import pytestclass PositionalEncoding(nn.Module):def __init__(self, d_model, max_seq_length5000):super(PositionalEncoding, self).__init__()# 創建位置編碼矩陣p…

centos 8.3(阿里云服務器)mariadb由系統自帶版本(10.3)升級到10.6

1. 備份數據庫 在進行任何升級操作前,務必備份所有數據庫: mysqldump -u root -p --all-databases > all_databases_backup.sql # 或者為每個重要數據庫單獨備份 mysqldump -u root -p db_name1 > db_name1_backup.sql mysqldump -u root -p db…

如何穩定地更新你的大模型知識(算法篇)

目錄 在線強化學習的穩定知識獲取機制:算法優化與數據策略一、算法層面的穩定性控制機制二、數據處理策略的穩定性保障三、訓練過程中的漸進式優化策略四、環境設計與反饋機制的穩定性影響五、穩定性保障的綜合應用策略六、總結與展望通過強化學習來讓大模型學習高層語義知識,…

圖的遍歷模板

圖的遍歷 BFS 求距離 #include<bits/stdc.h>using namespace std;int n, m, k,q[20001],dist[20001]; vector<int> edge[20001];int main(){scanf("%d%d%d",&n,&m,&k);for (int i 1;i<m;i){int x,y;scanf("%d%d",&x,&am…

Java集合 - LinkedList底層源碼解析

以下是基于 JDK 8 的 LinkedList 深度源碼解析&#xff0c;涵蓋其數據結構、核心方法實現、性能特點及使用場景。我們從 類結構、Node節點、插入/刪除/訪問操作、線程安全、性能對比 等角度進行詳細分析 一、類結構與繼承關系 1. 類定義 public class LinkedList<E> e…

Pytorch 卷積神經網絡參數說明一

系列文章目錄 文章目錄 系列文章目錄前言一、卷積層的定義1.常見的卷積操作2. 感受野3. 如何理解參數量和計算量4.如何減少計算量和參數量 二、神經網絡結構&#xff1a;有些層前面文章說過&#xff0c;不全講1. 池化層&#xff08;下采樣&#xff09;2. 上采樣3. 激活層、BN層…

C++ 中的 iostream 庫:cin/cout 基本用法

iostream 是 C 標準庫中用于輸入輸出操作的核心庫&#xff0c;它基于面向對象的設計&#xff0c;提供了比 C 語言的 stdio.h 更強大、更安全的 I/O 功能。下面詳細介紹 iostream 庫中最常用的輸入輸出工具&#xff1a;cin 和 cout。 一、 基本概念 iostream 庫&#xff1a;包…

SAP復制一個自定義移動類型

SAP復制移動類型 在SAP系統中&#xff0c;復制移動類型201可以通過事務碼OMJJ或SPRO路徑完成&#xff0c;用于創建自定義的移動類型以滿足特定業務需求。 示例操作步驟 進入OMJJ事務碼&#xff1a; 打開事務碼OMJJ&#xff0c;選擇“移動類型”選項。 復制移動類型&#xff…

Bambu Studio 中的“回抽“與“裝填回抽“的區別

回抽 裝填回抽: Bambu Studio 中的“回抽” (Retraction) 和“裝填回抽”(Prime/Retract) 是兩個不同的概念&#xff0c;它們都與材料擠出機的操作過程相關&#xff0c;但作用和觸發條件有所不同。 回抽(Retraction): 回抽的作用, 在打印機移動到另一個位置之前&#xff0c;將…

危化品安全監測數據分析挖掘范式:從被動響應到戰略引擎的升維之路

在危化品生產的復雜生態系統中,安全不僅僅是合規性要求,更是企業生存和發展的生命線。傳統危化品安全生產風險監測預警系統雖然提供了基礎保障,但其“事后響應”和“單點預警”的局限性日益凸顯。我們正處在一個由大數據、人工智能、數字孿生和物聯網技術驅動的范式變革前沿…

C++ RPC 遠程過程調用詳細解析

一、RPC 基本原理 RPC (Remote Procedure Call) 是一種允許程序調用另一臺計算機上子程序的協議,而不需要程序員顯式編碼這個遠程交互細節。其核心思想是使遠程調用看起來像本地調用一樣。 RPC 工作流程 客戶端調用:客戶端調用本地存根(stub)方法參數序列化:客戶端存根將參…

Python:操作 Excel 預設色

??親愛的技術愛好者們,熱烈歡迎來到 Kant2048 的博客!我是 Thomas Kant,很開心能在CSDN上與你們相遇~?? 本博客的精華專欄: 【自動化測試】 【測試經驗】 【人工智能】 【Python】 Python 操作 Excel 系列 讀取單元格數據按行寫入設置行高和列寬自動調整行高和列寬水平…