【iOS】編譯和鏈接、動靜態庫及dyld的簡單學習

文章目錄

  • 編譯和鏈接
    • 1??核心結論:一句話區分
    • 2??編譯過程:從源代碼到目標文件(.o)
      • 2.1 預處理(Preprocessing):“替換變量+復制粘貼”
      • 2.2 編譯(Compilation):“翻譯成機器能懂的語言”
      • 2.3 匯編(Assembly):“翻譯成機器指令”
      • 2.4 實戰:用命令行觀察編譯過程
  • 動態庫和靜態庫
    • 1??關于動態庫和靜態庫核心結論:一句話區分
    • 2??底層原理:編譯鏈接過程的差異
      • 2.1 靜態庫(.a / .framework):“復制粘貼”到可執行文件
      • 2.2 動態庫(.dylib / .framework / .tbd):“取件券”+ 運行時加載
    • 3??核心差異對比:體積、內存、更新、依賴
    • 4??實戰:iOS 中的靜態庫與動態庫
      • 4.1 靜態庫的典型應用
      • 4.2 動態庫的典型應用
    • 5??常見誤區
      • 誤區 1:動態庫一定比靜態庫“好”
      • 誤區 2:動態庫體積一定小
      • 誤區 3:iOS 中動態庫無法直接使用
    • 6??總結:如何選擇?
  • DYLD
    • 1??DYLD 是什么?核心職責
    • 2??DYLD 的工作流程(以 iOS App 啟動為例)
      • 2.1 準備階段:收集依賴信息
      • 2.2 加載階段:將動態庫讀入內存
      • 2.3 符號解析:找到函數的“實際地址”
      • 2.4 鏈接階段:縫合程序與動態庫
    • 3??DYLD2:經典但逐漸落后的動態鏈接器
      • 3.1 DYLD2 的核心問題
        • (1)啟動速度慢:串行加載 + 全量加載
        • (2)符號解析效率低:全局鎖競爭
        • (3)內存碎片:重復加載相同庫
    • 4??DYLD3:蘋果的“性能革命”動態鏈接器
      • 4.1 啟動速度優化:并行加載 + 按需加載
        • (1)并行加載依賴庫
        • (2)惰性加載(Lazy Binding)升級
      • 4.2 內存效率優化:共享緩存 + 惰性卸載
        • (1)共享緩存(`dyld shared cache`)
        • (2)惰性卸載(Lazy Unloading)
      • 4.3 新特性支持:適配現代系統
    • 5??DYLD3 的底層技術細節
      • 5.1 依賴關系圖分析(Dependency Graph)
      • 5.2 符號解析的“三級跳”
      • 5.3 內存管理的“智能回收”
    • 6??開發者如何適配 DYLD3?
      • 6.1 檢查當前使用的 DYLD 版本
      • 6.2 適配 DYLD3 的注意事項
        • (1)避免依賴加載順序
        • (2)優化符號可見性
        • (3)減少動態庫依賴
        • (4)適配 Swift 代碼
    • 7??總結

編譯和鏈接

1??核心結論:一句話區分

  • 編譯:把“設計圖紙”(源代碼)翻譯成“建筑零件”(目標文件),解決單個文件的“語法正確性”和“初步功能實現”。
  • 鏈接:把多個“建筑零件”(目標文件)和“標準建材”(庫文件)組裝成“完整房子”(可執行文件),解決多文件間的“依賴關系”和“符號解析”。

2??編譯過程:從源代碼到目標文件(.o)

編譯是將 單個源代碼文件(.m/.c) 轉換為 目標文件(.o,Object File) 的過程,本質是“翻譯+初步加工”。它分為 4 個階段,像“工廠流水線”一樣逐步處理。

2.1 預處理(Preprocessing):“替換變量+復制粘貼”

預處理是編譯的第一步,主要處理源代碼中的 預處理指令(以 # 開頭的行),類似“批量替換”和“文件拼接”。

常見預處理指令

  • #import/#include:復制頭文件內容到當前文件(類似“粘貼”)——小心循環引用。
  • #define:定義宏(如 #define MAX(a,b) ((a)>(b)?(a):(b))),編譯前替換代碼中的宏調用(類似“批量替換”)。
  • #ifdef/#endif:條件編譯(根據宏是否存在決定是否保留某段代碼)。

例子
假設 Dog.h 內容為:

#define DOG_NAME @"小狗"
@interface Dog : NSObject
- (void)setName:(NSString *)name;
@end

Dog.m#import "Dog.h" 時,預處理會將 DOG_NAME 替換為 @"小狗",并將 Dog 類的聲明復制到 Dog.m 中。

2.2 編譯(Compilation):“翻譯成機器能懂的語言”

預處理后的代碼會被編譯器(如 Clang)轉換為 匯編代碼.s 文件),這是“人類能讀懂的機器語言”。

關鍵步驟

  • 語法檢查:檢查代碼是否符合 OC 語法規則(如方法名是否正確、括號是否匹配)。如果報錯(如“Expected ‘;’ after expression”),編譯失敗。
  • 語義分析:檢查代碼邏輯是否合理(如變量是否聲明后使用、方法是否存在)。例如,調用 [dog fly]Dog 類沒有 fly 方法,編譯器會警告(但不會報錯,因為 OC 是動態語言)。
  • 生成匯編:將 OC 代碼轉換為 CPU 能識別的匯編指令(如 movcall 等)。

2.3 匯編(Assembly):“翻譯成機器指令”

匯編器(如 as)將匯編代碼(.s)轉換為 機器指令(二進制格式),生成 目標文件(.o)

目標文件(.o)的內容

  • 代碼段(Text Section):存儲機器指令(如方法的具體實現)。
  • 數據段(Data Section):存儲全局變量、靜態變量(如 static int count = 0)。
  • 符號表(Symbol Table):記錄文件中定義的符號(如函數名、全局變量名)和引用的外部符號(如調用了其他文件的方法)。
  • 重定位表(Relocation Table):記錄需要外部鏈接的位置(如調用了其他文件的方法,需要鏈接時修正地址)。

2.4 實戰:用命令行觀察編譯過程

在 macOS 終端,用 clang 命令手動編譯一個 OC 文件,觀察中間產物:

# 編譯 Dog.m 生成 Dog.o(目標文件)
clang -c Dog.m -o Dog.o# 查看 Dog.o 的符號表(包含定義和引用的符號)
nm Dog.o
# 輸出類似:
#                 U _NSLog
#                 T _dogSayHello
# 0000000000000000

我們用 “工具包”“共享倉庫” 的生活化場景,結合 iOS 開發中的實際案例,徹底講透 靜態庫動態庫 的區別與核心邏輯。

動態庫和靜態庫

1??關于動態庫和靜態庫核心結論:一句話區分

  • 靜態庫:把“工具包”(代碼)直接“塞進”你的工具箱(可執行文件),你的工具箱從此“自給自足”,但體積變大。
  • 動態庫:把“工具包”放在“共享倉庫”(系統目錄),你的工具箱只留一張“取件券”(引用),需要時去倉庫拿,體積小但依賴倉庫。

2??底層原理:編譯鏈接過程的差異

2.1 靜態庫(.a / .framework):“復制粘貼”到可執行文件

靜態庫的本質是 一組目標文件(.o)的打包集合(用 ar 工具打包)。在編譯鏈接階段,編譯器會把靜態庫中所有用到的代碼 完整復制 到最終的可執行文件中。靜態庫通常以 .a(Unix、Linux)或 .lib(Windows)以及MacOS 獨有的 .framework為擴展名。

關鍵步驟

  1. 編譯源文件生成 .o 目標文件(如 Dog.o)。
  2. 鏈接器將 .o 文件和靜態庫(如 libDog.a)中需要的 .o 合并,生成可執行文件(如 App)。
  3. 可執行文件體積增大(包含靜態庫的所有代碼),但運行時無需額外依賴。

2.2 動態庫(.dylib / .framework / .tbd):“取件券”+ 運行時加載

動態庫的本質是 獨立的二進制文件,存儲在系統或應用的特定目錄中。編譯鏈接階段,編譯器只記錄動態庫中用到的函數的“地址線索”(符號引用),不會復制代碼到可執行文件中。動態庫的格式有:.framework、.dylib、.tbd……

關鍵步驟

  1. 編譯源文件生成 .o 目標文件(如 Dog.o)。
  2. 鏈接器生成可執行文件時,僅記錄動態庫(如 libDog.dylib)的路徑和符號引用(如 +[Dog bark])。
  3. 運行時,系統根據可執行文件中的“地址線索”,從動態庫中加載所需代碼到內存,供程序調用。

3??核心差異對比:體積、內存、更新、依賴

對比項靜態庫動態庫
體積可執行文件體積大(包含庫代碼)可執行文件體積小(僅存符號引用)
內存占用每個程序獨立復制庫代碼,內存浪費多個程序共享同一份庫代碼,內存高效
更新維護庫更新需重新編譯所有依賴它的程序替換動態庫文件即可,無需重新編譯程序
依賴管理無外部依賴(庫代碼已嵌入)強依賴動態庫路徑(運行時需找到庫文件)
典型場景需獨立運行的工具(如命令行程序)系統框架(如 UIKit)、高頻共享庫

4??實戰:iOS 中的靜態庫與動態庫

4.1 靜態庫的典型應用

  • 自定義靜態庫:開發者將常用功能(如網絡請求、加密算法)打包為 .a.framework,提供給其他項目直接集成。
    ??優點??:避免重復開發,保護代碼隱私(靜態庫代碼嵌入可執行文件,反編譯難度更高)。
    ??缺點??:每次更新庫需重新編譯宿主項目。

4.2 動態庫的典型應用

  • 系統框架(如 UIKit、Foundation):iOS 系統自帶的核心框架均為動態庫,存儲在 /System/Library/Frameworks 目錄。
    ??優點??:所有 App 共享同一份框架代碼,大幅節省內存;系統升級時自動更新框架(如 iOS 17 升級后,UIKit 動態庫同步更新)。
  • 第三方動態庫(如微信 SDK、支付寶 SDK):部分 SDK 提供動態庫版本(.framework.tbd),允許 App 直接調用,無需嵌入代碼。

5??常見誤區

誤區 1:動態庫一定比靜態庫“好”

動態庫的優勢是節省內存和方便更新,但并非所有場景都適用:

  • 若需要 離線運行(如無網絡環境下的工具類 App),靜態庫更可靠(無需依賴外部動態庫)。
  • 若庫代碼需要 高度定制(如修改底層實現),靜態庫更靈活(直接修改源碼重新編譯)。

誤區 2:動態庫體積一定小

動態庫本身的體積可能很大(如 UIKit 框架),但多個 App 共享時,內存總占用會遠小于每個 App 都嵌入一份靜態庫的體積。

誤區 3:iOS 中動態庫無法直接使用

iOS 支持動態庫,但需注意:

  • 自定義動態庫需通過 Xcode 打包為 .framework(需設置 Install Path@executable_path/Frameworks)。
  • 上架 App Store 時,動態庫需包含在 App 包內(否則無法加載),因此實際開發中靜態庫更常見于第三方 SDK。

6??總結:如何選擇?

  • 選靜態庫:需要獨立運行、保護代碼、避免外部依賴。
  • 選動態庫:需要共享內存、頻繁更新、節省資源。

一句話總結:靜態庫是“一次性買斷的工具包”,動態庫是“共享倉庫的取件券”,根據需求選擇最適合的復用方式。

DYLD

1??DYLD 是什么?核心職責

DYLD(Dynamic Link Editor)是蘋果為 macOS/iOS 設計的 動態鏈接器,負責解決程序運行時的 動態依賴 問題。它的核心職責可以概括為三個步驟:

  1. 加載動態庫:將程序依賴的 .dylib.framework 或系統庫從磁盤加載到內存。
  2. 解析符號:找到程序中調用的函數/變量在動態庫中的實際內存地址(符號綁定)。
  3. 鏈接程序:將程序代碼與動態庫代碼“縫合”,確保調用動態庫函數時能正確跳轉。

2??DYLD 的工作流程(以 iOS App 啟動為例)

無論 DYLD2 還是 DYLD3,核心流程都圍繞 加載→解析→鏈接 展開,但具體實現細節差異巨大。以下是通用流程:

2.1 準備階段:收集依賴信息

App 啟動時,內核(kernel)會讀取可執行文件的 頭部信息Mach-O 頭),獲取其依賴的動態庫列表(如 libSystem.dylibUIKit.framework)。

關鍵數據結構

  • dyld_image_info:記錄每個動態庫的路徑、加載地址、依賴關系等信息。

2.2 加載階段:將動態庫讀入內存

根據依賴列表,DYLD 從磁盤或共享緩存(dyld shared cache)中加載動態庫到內存。

DYLD2 的加載方式

  • 串行加載:按依賴順序逐個加載(如先加載 A.dylib,再加載依賴 AB.dylib)。
  • 全量加載:即使動態庫未被立即使用,也會完整加載到內存(可能導致內存浪費)。

2.3 符號解析:找到函數的“實際地址”

程序中調用的函數(如 [UIView addSubview:])在編譯時只是符號(如 _objc_msgSend),DYLD 需要將其映射到動態庫中的真實內存地址。

DYLD2 的符號解析

  • 全局鎖阻塞:所有符號解析需競爭同一把全局鎖(dyld lock),多線程場景下容易成為瓶頸。
  • 懶解析(Lazy Binding):部分符號延遲到首次調用時解析(減少啟動時的計算量)。

2.4 鏈接階段:縫合程序與動態庫

將程序的代碼段(__TEXT)與動態庫的代碼段(__TEXT)通過 內存地址重定位 關聯,確保調用指令(如 call)能正確跳轉到動態庫的函數入口。

3??DYLD2:經典但逐漸落后的動態鏈接器

DYLD2 是蘋果早期的動態鏈接器(隨 macOS 10.4/Tiger 引入),在 iOS 13 前是默認實現。它的設計思路是 穩定優先,但在性能和內存效率上存在明顯短板。

3.1 DYLD2 的核心問題

(1)啟動速度慢:串行加載 + 全量加載
  • 串行加載:依賴鏈越長(如復雜 App 可能有數百個動態庫),加載時間越長。例如,一個依賴 100 個動態庫的 App,DYLD2 需執行 100 次磁盤讀取和內存分配。
  • 全量加載:即使動態庫僅在后臺使用(如統計 SDK),也會在啟動時完整加載,占用寶貴的內存資源(尤其是 iOS 設備內存有限)。
(2)符號解析效率低:全局鎖競爭

DYLD2 使用全局鎖(dyld lock)保證符號解析的線程安全,但多線程場景下(如 App 啟動時同時初始化多個模塊),鎖競爭會導致大量線程阻塞,延長啟動時間。

(3)內存碎片:重復加載相同庫

多個進程(如同時運行的微信、支付寶)若依賴同一動態庫(如 libSystem.dylib),DYLD2 會為每個進程單獨加載一份,導致內存冗余(同一庫在內存中存在多份副本)。

4??DYLD3:蘋果的“性能革命”動態鏈接器

DYLD3 隨 iOS 13/macOS 10.15 引入,目標是 大幅提升啟動速度、降低內存占用。它針對 DYLD2 的痛點進行了全面重構,核心改進體現在以下方面:

4.1 啟動速度優化:并行加載 + 按需加載

(1)并行加載依賴庫

DYLD3 通過 依賴關系圖分析dependency graph),識別無沖突的動態庫(即彼此無依賴的庫),并 并發加載 它們。例如,若 A.dylibB.dylib 無依賴關系,DYLD3 可同時加載這兩個庫,將加載時間從串行的 T1+T2 縮短為 max(T1, T2)

技術實現

  • 使用 dispatch_grouppthread 實現多線程加載。
  • 通過 dyld3 私有 API 與內核協作,優化磁盤讀取(如預讀取相鄰磁盤塊)。
(2)惰性加載(Lazy Binding)升級

DYLD3 將“懶解析”從“部分符號”擴展到“大部分符號”,僅在函數 首次調用時 執行符號解析和地址重定位。例如,一個包含 1000 個函數的動態庫,若啟動時僅調用其中 10 個,DYLD3 僅解析這 10 個函數的地址,其余 990 個延遲到調用時處理。

4.2 內存效率優化:共享緩存 + 惰性卸載

(1)共享緩存(dyld shared cache

DYLD3 引入 全局共享緩存,將常用動態庫(如 libSystem.dylibUIKit.framework)的解析結果(符號地址、加載路徑等)緩存到系統級內存中。多個進程(如微信、支付寶)調用同一庫時,直接從共享緩存中讀取,避免重復加載和解析。

數據驗證

  • 共享緩存可減少 30%-50% 的動態庫加載時間(蘋果官方測試數據)。
(2)惰性卸載(Lazy Unloading)

DYLD3 允許未使用的動態庫在內存緊張時被卸載(回收內存),并在需要時重新加載。例如,一個后臺統計庫在 App 切到前臺時未被使用,DYLD3 可將其卸載,釋放內存給前臺模塊。

4.3 新特性支持:適配現代系統

DYLD3 針對 iOS 13+ 和 macOS 10.15+ 的新特性做了深度優化:

特性DYLD3 支持細節
Swift 動態鏈接優化 Swift 符號的綁定(如泛型、協議擴展),減少 Swift 代碼的啟動延遲(比 DYLD2 快 20%+)。
arm64e 架構針對蘋果自研芯片(如 A12+)優化指令集適配,提升 ARM64e 代碼的執行效率。
App Sandbox 安全增強對動態庫的簽名驗證(檢查 LC_CODE_SIGNATURE),防止惡意庫注入(僅允許加載已簽名庫)。

5??DYLD3 的底層技術細節

5.1 依賴關系圖分析(Dependency Graph)

DYLD3 在加載前會構建 依賴關系圖(有向無環圖,DAG),通過拓撲排序確定加載順序。例如:

App → A.dylib → B.dylib  
App → C.dylib → B.dylib  

此時,B.dylibAC 的共同依賴,DYLD3 會先加載 B.dylib,再并行加載 AC

5.2 符號解析的“三級跳”

DYLD3 的符號解析分為三個階段,逐步細化:

  1. 預解析(Prebinding):在加載階段,通過共享緩存快速查找符號的大致地址范圍(減少后續搜索時間)。
  2. 精確解析(Binding):首次調用符號時,通過 dyld_stub_binder 函數精確計算符號的內存地址(更新 __DATA 段的指針)。
  3. 緩存優化(Caching):將解析結果存入共享緩存,后續調用直接讀取緩存(避免重復計算)。

5.3 內存管理的“智能回收”

DYLD3 使用 引用計數 + LRU(最近最少使用) 策略管理動態庫內存:

  • 每個動態庫被加載后,引用計數加 1(進程持有)。
  • 當內存緊張時,DYLD3 優先卸載引用計數低且長時間未使用的庫(LRU 策略)。

6??開發者如何適配 DYLD3?

6.1 檢查當前使用的 DYLD 版本

  • 通過日志:運行應用時添加環境變量 DYLD_PRINT_VERSION=1,日志會輸出 dyld: version 3.x(DYLD3)或 dyld: version 2.x(DYLD2)。
  • 通過系統版本:iOS 13+ 和 macOS 10.15+ 默認啟用 DYLD3(除非強制指定 DYLD2)。

6.2 適配 DYLD3 的注意事項

(1)避免依賴加載順序

DYLD3 的并行加載可能改變動態庫的加載順序,若代碼依賴特定順序(如 +load 方法中調用其他庫的函數),可能導致崩潰。需確保 +load 方法無外部依賴。

(2)優化符號可見性

DYLD3 對未導出的符號(如 static 函數)解析更嚴格,需通過 __attribute__((visibility("default"))) 顯式導出:

// 顯式導出符號,避免 DYLD3 無法解析
__attribute__((visibility("default")))
void myFunction() {// ...
}
(3)減少動態庫依賴

DYLD3 雖然優化了加載效率,但過多的動態庫仍會增加依賴圖復雜度。盡量合并功能到少量動態庫,或使用靜態庫(僅當需要離線運行時)。

(4)適配 Swift 代碼

DYLD3 對 Swift 的支持更友好,但仍需注意:

  • 避免使用 @_transparent 等私有屬性(可能影響符號可見性)。
  • 確保 Swift 模塊的 swiftmodule 目錄結構正確(DYLD3 依賴此結構解析符號)。

7??總結

DYLD 從 DYLD2 到 DYLD3 的演進,本質是蘋果對 啟動速度內存效率 的極致追求。DYLD3 通過并行加載、共享緩存、惰性解析等技術,將動態鏈接的瓶頸從“啟動時間”轉移到“運行時效率”,為現代 iOS 應用的高性能運行提供了底層保障。

開發者行動建議

  • 優先適配 DYLD3(目標系統為 iOS 13+),利用其性能優勢。
  • 優化動態庫依賴,減少不必要的加載。
  • 關注蘋果官方文檔,及時適配新特性(如 Swift 動態鏈接優化)。

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

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

相關文章

金山辦公WPS項目產品總監陳智新受邀為第十四屆中國PMO大會演講嘉賓

全國PMO專業人士年度盛會珠海金山辦公軟件有限公司WPS項目產品總監 陳智新先生 受邀為“PMO評論”主辦的2025第十四屆中國PMO大會演講嘉賓,演講議題為:中小團隊PMO的成長之路,敬請關注!議題簡要:在競爭激烈、需求多變的…

web安全 | docker復雜環境下的內網打點

本文作者:Track-syst1m一.前言本文涉及的相關漏洞均已修復、本文中技術和方法僅用于教育目的;文中討論的所有案例和技術均旨在幫助讀者更好地理解相關安全問題,并采取適當的防護措施來保護自身系統免受攻擊。二.大概流程1. 外網打點? 漏洞利…

iTwin 幾何屬性獲取

面積體積半徑獲取幾何屬性,如面積,體積,半徑,可以使用getMassProperties這個接口async onGetMassProperty(){const vp IModelApp.viewManager.selectedView;const iModel vp?.iModel;if (!iModel) return;console.log("iM…

OpenLayers 快速入門(九)Extent 介紹

看過的知識不等于學會。唯有用心總結、系統記錄,并通過溫故知新反復實踐,才能真正掌握一二 作為一名摸爬滾打三年的前端開發,開源社區給了我飯碗,我也將所學的知識體系回饋給大家,助你少走彎路! OpenLayers…

LeetCode 121. 買賣股票的最佳時機 LeetCode 122. 買賣股票的最佳時機II LeetCode 123.買賣股票的最佳時機III

LeetCode 121. 買賣股票的最佳時機嘗試一:暴力解決方法常用兩個指針去遍歷prices數組,dp[i]用于記錄在第i天所獲得的最大利潤。時間復雜度是O(N^2),超出時間限制。Codeclass Solution(object):def maxProfit(self, prices):"""…

【LeNet網絡架構】——深度學習.卷積神經網絡

目錄 1 MLP 2 LeNet簡介 3 Minst數據集 3.1 MINST數據集簡介 3.2 MNIST數據集的預處理 4 LeNet手寫數字識別 LeNet由Yann Lecun 提出,是一種經典的卷積神經網絡,是現代卷積神經網絡的起源之一。Yann將該網絡用于郵局的郵政的郵政編碼識別&#xff…

Python筆記完整版

常用pip源 (1)阿里云 http://mirrors.aliyun.com/pypi/simple/(2)豆瓣 http://pypi.douban.com/simple/(3)清華大學 https://pypi.tuna.tsinghua.edu.cn/simple/(4)中國科學技術大學…

2025 鴻蒙創新賽又來了,萬少教你如何強勢切入 HarmonyOS AI特性

2025 鴻蒙創新賽又來了,萬少教你如何強勢切入 前言 ? 2025 華為HarmonyOS 創新賽又來了,創新賽是鴻蒙生態最大規模開發者官方賽事,最高獲百萬激勵。 參賽資格 面向所有開發者開放以隊伍的形式來參加,可以一個人報名一個隊伍&a…

【智能模型系列】Unity通過訪問Ollama調用DeepSeek模型進行本地部署

【智能模型系列】Unity通過訪問Ollama調用DeepSeek模型進行本地部署 目錄 一、前言 二、環境準備 三、核心代碼解析 1、參數配置 2. CallDeepSeek.cs - API交互控制器 3、 MainPanel.cs - 用戶界面控制器 四、源碼 一、前言 在本教程中,我將分享如何在Unity中集成本地…

什么是5G-A三防平板?有什么特點?哪些領域能用到?

在工業自動化與數字化轉型浪潮中,三防平板電腦已成為“危、急、特”場景的核心工具。這類設備不僅具備堅固耐用的物理防護特性,更融合了先進的通信技術與智能處理能力。而隨著5G技術向5G-A階段演進,新一代三防平板正為行業應用注入全新動能。…

Flink實時流量統計:基于窗口函數與Redis Sink的每小時PV監控系統(學習記錄)

題目:利用flink統計網站瀏覽量,并寫入redis。利用窗口函數以及算子實現每小時PV(網站的頁面瀏覽量)統計,對統計后結果數據格式進行設計,存儲至Redis中(利用sink將處理后結果數據輸出到redis數據…

使用Imgui和SDL2做的一個彈球小游戲-Bounze

使用Imgui和SDL2做的一個彈球小游戲-Bounze 油管上面TheCherno博主分享的一個視頻FIRST GAME in C! Did He Do a Good Job? // Code Review (C/SDL2)里面分享了一個Github項目: https://github.com/staticaron/Bounze 使用了Imgui和SDL2,并且可以設置音…

SQL 中 CASE WHEN 及 SELECT CASE WHEN 的用法

SQL 中 CASE WHEN 及 SELECT CASE WHEN 的用法 CASE WHEN 是 SQL 中非常實用的條件表達式,它允許你在查詢中實現條件邏輯。以下是詳細的用法說明: 1. 基本語法結構 CASE WHEN condition1 THEN result1WHEN condition2 THEN result2...ELSE default_resul…

CentOS 7 Linux 基礎知識點匯總

🐧 CentOS 7 Linux 基礎知識點匯總為方便初學者快速掌握 CentOS 7 系統的核心操作,本文檔整理了常用系統命令、快捷鍵、目錄結構及文件后綴名等基礎內容,適合入門參考。 一、常見系統命令 🔍 命令行提示符說明 終端中的提示符包含…

突發限制下的破局之路:國產之光 Lynx 重構 AI 開發安全壁壘

繼 Pro 套餐 “明升暗降” 爭議后,Cursor 本周再掀波瀾 —— 包括 Claude 系列、GPT-4 在內的主流模型一夜之間對中國用戶全面封禁。開發者社群瞬間沸騰,“付費卻用不了”“項目數據導不出” 的焦慮刷屏,境外工具的政策波動再次給行業敲響警鐘…

滲透測試實戰 | docker復雜環境下的內網打點

本文作者:Track-syst1m一.前言本文涉及的相關漏洞均已修復、本文中技術和方法僅用于教育目的;文中討論的所有案例和技術均旨在幫助讀者更好地理解相關安全問題,并采取適當的防護措施來保護自身系統免受攻擊。二.大概流程1. 外網打點漏洞利用?…

阿里云服務器 CentOS 7 安裝 MySQL 8.4 超詳細指南

阿里云服務器 CentOS 7 安裝 MySQL 8.4 超詳細指南 一、準備工作 系統要求: CentOS 7.9 64位2 核(vCPU)2 GiBroot 用戶權限 服務器連接工具: FinalShell 下載安裝包: 訪問 MySQL 官網選擇版本:MySQL 8.4.0…

解決 Electron 中 window.open 打開新窗口的各種“坑”

嘿,各位開發者們!今天我們要聊聊在使用 Electron 時遇到的一個經典問題:如何正確地使用 window.open 來打開新窗口? 這聽起來似乎很簡單,但實際上卻充滿了各種“驚喜”(或者說“驚嚇”)。別擔心…

朝歌智慧盤古信息:以IMS MOM V6重構國產化智能終端新生態

隨著5G、云計算、AI、大數據等技術深度滲透,智能終端行業正迎來場景化創新的爆發期。面對市場需求升級與技術迭代壓力,國產化智能終端領域領軍企業——廣東朝歌智慧互聯科技有限公司(以下簡稱“朝歌智慧”),基于集團“…

docker 離線安裝postgres+postgis實踐

文章目錄前言一、離線安裝docker二、導出導入PG鏡像1.導出2.導入三、啟動容器四、驗證與測試前言 在企業內網環境中部署地理信息系統(GIS)時,常常面臨網絡隔離導致無法在線拉取 Docker 鏡像的問題。 本文將詳細介紹如何通過離線方式完成 Pos…