linux之autoconf(1)基礎介紹

Linux之autoconf(1)基礎介紹

Author:Onceday Date:2023年2023年12月10日

漫漫長路,才剛剛開始…

本文主要內容翻譯自Autoconf官方文檔,僅供學習交流之用。

全系列文章請查看專欄: buildroot編譯框架_Once_day的博客-CSDN博客。

參考文檔:

  • Autoconf 教程 Part-1 翻譯 - 紅色的紅 - 知乎 (zhihu.com)
  • autoconf / automake工具使用介紹 - Primitive - 博客園 (cnblogs.com)
  • 感覺autoconf真不太好用,有何替代方案? - 知乎 (zhihu.com)
  • Autoconf - GNU Project - Free Software Foundation
  • GNU Autoconf - Creating Automatic Configuration Scripts - GNU Project - Free Software Foundation
  • GNU M4 - GNU Project - Free Software Foundation
  • GNU M4 - GNU macro processor - GNU Project - Free Software Foundation
  • Automake - GNU Project - Free Software Foundation
  • Libtool - GNU Project - Free Software Foundation
  • GNU Libtool - Portable Dynamic Shared Object Management - GNU Project - Free Software Foundation
  • Gnulib - GNU Portability Library - GNU Project - Free Software Foundation
  • GNU Autoconf, Automake and Libtool (sourceware.org)
  • Autotools Tutorial (epita.fr)

文章目錄

      • Linux之autoconf(1)基礎介紹
        • 1. 概述
          • 1.1 介紹
          • 1.2 Autotools之Automake介紹
          • 1.3 Autotools之Gnulib介紹
          • 1.4 Autotools之Libtool介紹
        • 2. Autotools使用流程
          • 2.1 Autotools工具、項目、庫文件關系圖
        • 附錄
          • 附錄: Autotools介紹
          • 附錄: Gnulib介紹
          • 附錄: Gettext介紹

1. 概述
1.1 介紹

Autoconf 是一個為了生成可以自動配置的源代碼包而設計的工具。它的主要目的是創建一個腳本,通常叫做 configure 腳本,它可以在軟件安裝前檢測目標系統的特性并自動調整軟件以適應這些系統。Autoconf 是自由軟件基金會的 GNU 項目的一部分,廣泛應用于 Unix-like 系統上的開源軟件中。

Autoconf 使用 M4 宏處理語言生成 configure 腳本。軟件開發者編寫一個名為 configure.acconfigure.in 的模板文件,其中包含了檢測特定功能,庫文件,編譯器選項等的宏調用。Autoconf 處理這個模板文件,并創建一個可移植的 shell 腳本 configure

主要功能包括:

  • 檢測系統特性:檢查編譯器選項、庫函數、系統服務等是否存在。
  • 跨平臺支持:通過生成的腳本可以適應多種不同的操作系統和環境。
  • 生成 Makefile:通常與 Automake 結合使用,根據 Makefile.am 模板文件生成 Makefile.in,然后 configure 腳本會進一步生成最終的 Makefile
  • 用戶友好:生成的配置腳本通常支持像 --prefix 等標準配置選項,以及檢測過程中的有用提示和錯誤信息。

使用 Autoconf 的基本步驟如下:

  1. 編寫 configure.ac:定義宏和測試,指定生成的文件等。
  2. 運行 autoconf:生成 configure 腳本。
  3. 分發源代碼:將源代碼包含 configure 腳本一起分發。
  4. 構建軟件:用戶下載源代碼包后,運行 configure 腳本并接著使用 make 構建軟件。

Autoconf 通常與其他工具一起使用,如 Automake(生成規范的 Makefile 文件)和 Libtool(處理共享庫的生成)。這些工具的結合使用構成了一個強大的自動化構建系統,它可以處理許多編譯和安裝軟件時可能出現的復雜性。

Autoconf解決了一個重要的問題,可靠地發現特定于系統的構建和運行時信息,但這只是可移植軟件開發難題的一部分。為此,GNU項目開發了一套集成的實用程序來完成Autoconf啟動的工作: GNU構建系統,其最重要的組件是AutoconfAutomakeLibtool

GNU構建系統,有時也被稱為 Autotools,是一套由 GNU 項目開發的編程工具,它們的目的是協助創建跨平臺的軟件包。這套工具包括 Autoconf, Automake, Libtool 和一些其他輔助工具,它們各自承擔不同的職責,協同工作以簡化構建過程。

整體性學習Autotools使用和流程,可以參考下面兩本書(都可以免費查看):

  • GNU Autoconf, Automake and Libtool (sourceware.org)
  • Autotools Tutorial (epita.fr)
1.2 Autotools之Automake介紹

make的普遍性意味著makefile幾乎是分發軟件自動構建規則的唯一可行方法,但很快就會遇到它的眾多限制。它缺乏對自動依賴跟蹤、子目錄中的遞歸構建、可靠的時間戳(例如,對于網絡文件系統)等等的支持,這意味著開發人員必須為每個項目痛苦地(通常是不正確的)重新發明輪子。

由于make在許多系統上的特性,可移植性是非常重要的。最重要的是,實現用戶期望的許多標準目標(make installmake distcleanmake uninstall等)所需的手工勞動。當然,由于使用的是Autoconf,因此還必須在Makefile.in中插入重復的代碼。以識別CCCFLAGSconfigure提供的其他替換,從這里開始,Automake便步入了這個混亂的世界。

Automake允許在Makefile.am中指定構建需求,使用比普通makefile更簡單和更強大的語法生成一個可移植的makefile.in,并在Autoconf中使用。例如,使用Makefile.am構建和安裝一個簡單的“Hello world”程序,如下所示:

bin_PROGRAMS = hello
hello_SOURCES = hello.c

生成的Makefile.in(大概400行代碼)自動支持所有標準目標、Autoconf提供的替換、自動依賴項跟蹤、VPATH構建等功能。Make構建hello程序,make install將其安裝在/usr/local/bin中(如果不是/usr/local,也可以是配置的前綴路徑)。

對于較大的包(特別是帶有子目錄的包),Automake的好處會增加,但即使對于小程序,增加的便利性和可移植性也是非常重要的。

1.3 Autotools之Gnulib介紹

GNU軟件可以在許多不同類型的系統上運行。雖然主要目標是為GNU系統編寫軟件,但許多用戶和開發人員是通過他們已經在使用的系統被介紹給我們的。

Gnulib是公共GNU代碼的中心位置,旨在在自由軟件包之間共享。它的組件通常在源代碼級別共享,而不是作為構建、安裝和鏈接的庫。其思想是將文件從Gnulib復制到您自己的源代碼樹中。沒有分發包,開發者只需要從存儲庫中獲取源模塊。源文件可在網上,在各種許可證,主要是 GNU GPL 或 GNU LGPL。

Gnulib模塊通常包含C源代碼以及用于配置源代碼的Autoconf宏。例如,Gnulib的stdalign模塊實現了一個幾乎符合C11的stdalin.h標準頭文件,即使在缺乏stdalin .h的老式主機上也是如此。該模塊包含替換頭文件的源文件,以及一個Autoconf宏,該宏安排在老式系統上使用替換頭文件。

1.4 Autotools之Libtool介紹

通常,人們不僅希望構建程序,還希望構建庫,以便其他程序可以從您的勞動成果中受益。理想情況下,人們希望生成共享的(動態鏈接的)庫,它可以被多個程序使用,而不會在磁盤或內存中復制,并且可以獨立于鏈接的程序進行更新。然而,可移植地生成共享庫是一場噩夢:每個系統都有自己不兼容的工具、編譯器標志和魔法咒語。幸運的是,GNU提供了一個解決方案: Libtool

Libtool可以處理構建共享庫的所有需求,并且目前似乎是實現可移植性的唯一方法。它還處理許多其他令人頭痛的問題,例如:Make規則與共享庫的變量后綴的交互,在超級用戶安裝共享庫之前與它們可靠地鏈接,以及提供一致的版本控制系統(以便可以在不破壞二進制兼容性的情況下安裝或升級庫的不同版本)。雖然Libtool,像Autoconf一樣,可以在沒有Automake的情況下使用。但它與Automake結合使用非常簡單:Libtool在需要共享庫時自動使用,而不需要知道它的語法。

2. Autotools使用流程

本處流程示例參考知乎問答: 感覺autoconf真不太好用,有何替代方案? - 知乎 (zhihu.com),其中宅學部落-王利濤(嵌入式C語言自我修養)的回復,欲了解詳情,請訪問以上鏈接,特別是原作者王利濤的文章。

2.1 Autotools工具、項目、庫文件關系圖

在這里插入圖片描述

雖然上面的圖看起來非常復雜,但是Autotools的發展并非是一蹴而就,其中有則漫長的歲月和時間積累,是在軟件開發過程中不斷解決問題的積累。圖中不同顏色代表了不同的工具作用,下面按照發展歷程總結它們的出現原因。

  • Makefile時代,這是最早期的情況,Makefile都是手寫。現在的程序員,更多只是要求能讀懂Makefile,畢竟如cmake和meson等現代化構建工具,比起Makefile,好用多了。

    手寫Makefile時,只需要Makefile、源代碼,便可以編譯出目標執行程序,中間所有Autotools步驟都不需要,但是隨著Unix類系統越來越復雜,Makefile也變得異常復雜,且難以閱讀和調試(真的很難調試)。另外一方面,沒有足夠的經驗(對于絕大部分人都是如此),Makefile很難符合標準,因此難以移植,往往換個項目和平臺,又要改一堆內容。

    因此,后來出現了configure腳本,先用腳本生成配置變量,再調用Makefile,腳本比起Makefile,更好調試。

  • 隨著linux操作系統的出現,Unix系統類別更多,不同系統之間差異越來越大,為了減少程序員在configure腳本上的無用功(多半是重復操作),因此出現了Autoconf工具,用于自動生成configure腳本。

    對于自動生成configure腳本,其代碼量依舊不少,但是屬于固定模板代碼,不容易出錯(相對于人工編寫而言)。用戶仍然可以定義項目特定的宏變量參數,放在configure.ac文件里,甚至于configure.ac文件都可以通過autoscan自動掃描項目文件來生成。

  • 隨著項目的龐大,Makefile手工編寫也越來越復雜,因此除了使用autoconf自動生成配置變量之外,也開發出了automake來自動生成標準的Makefile文件。

    用戶只需手工編寫一個makefile.am文件,定義生成目標和需要編譯的源文件,然后automake便可以自動生成Makefile.in文件,其中包含程序編譯、鏈接的基本規則。再通過configure腳本配置一下,便可以在當前特定平臺上執行。

    Makefile.in是面向于通用平臺的Makefile文件,在autoconf生成特定平臺的配置腳本configure之后,通過該配置腳本,便可以生成特定平臺的Makefile文件(實現一些標準變量定義,以符合特定平臺的需求)。

  • Automake和autoconf都會自行定義一些宏變量,這些宏變量需要進行互通,因此便采用M4宏語言實現,即aclocal.m4文件,其中還包含用戶項目自定義的宏參數。

    aclocal工具可以自行收集automakeautoconf以及用戶自定義宏放在aclocal.m4文件里面,這樣就無須手動復制這些宏到M4文件中。

    最終還有一個autoheader工具,該工具可以把configure.ac中的宏配置轉換為C語言的#define宏,這樣在代碼里的宏能根據實際平臺的值進行對應操作。configure腳本最終會生成一個config.h文件,很多配置框架都有類似的文件,比如kconfig這種。

  • 隨著動態庫/靜態庫越來越多,之間差異也逐漸增大,包括符號版本控制等。為此,出現了libtool工具,對動態庫進行抽象,統一生成.la的形式,這樣就可以跨平臺支持(告訴Makefile如何操作)。

附錄
附錄: Autotools介紹

(1) M4 宏處理器,M4 是一種通用的宏處理器,是一種用來在文本文件中定義和擴展宏(即預設的文本片段)的工具。它是 Autoconf 的核心組件,因為 Autoconf 的模板文件(configure.acconfigure.in)是用 M4 宏語言編寫的。M4 特別適用于生成代碼和自動化文本替換,也可以用來生成 HTML 或 XML 文件。M4 能處理復雜的文本替換和序列,支持條件語句、循環和遞歸宏調用等。

(2) Automake, Automake 是一個生成 Makefile 文件的工具,它使得管理 Makefile 文件更加簡單。它與 Autoconf 緊密集成,使用者僅需編寫一個相對簡單的 Makefile.am 文件,其中包括了程序需要的源文件和編譯指令。然后 Automake 會生成適用于不同平臺的 Makefile.in,這個文件隨后會被 Autoconf 生成的 configure 腳本處理,最終生成用于實際編譯軟件的 Makefile

(3) Libtool,Libtool 是一個用于統一庫文件編譯的腳本。在 Unix-like 系統中,共享庫和靜態庫的處理方式往往因操作系統的不同而有很大差異。Libtool 抽象了這些差異,允許開發者以統一的方式創建可移植的共享庫。它與 Autoconf 和 Automake 結合使用,使得開發者可以忽略庫文件編譯時的復雜性。

這三個工具經常一起使用,創建了一個強大的構建系統:

  1. Autoconf (configure.ac): 生成配置腳本(configure),用于檢測系統特性并配置軟件包以適合當前系統。
  2. Automake (Makefile.am): 生成 Makefile.in 模板,定義了如何編譯和安裝程序。
  3. Libtool: 處理庫文件的創建和使用。

當開發者準備好了 configure.acMakefile.am 文件后,他們會按照下面的步驟使用這些工具:

  • 使用 autoconf 生成 configure 腳本。
  • 使用 automake 生成 Makefile.in
  • 在構建時,運行 configure 腳本,它會檢測系統特性并使用來自 Makefile.in 的指令生成 Makefile
  • 最后,使用 make 命令來構建和安裝軟件。

這個過程隱藏了許多平臺差異,使得開發者可以專注于代碼本身,而不必為各種系統上的構建問題操心。

附錄: Gnulib介紹

Gnulib, 通常稱為 “GNU Portability Library”, 是一個由宏、腳本和代碼組成的庫,用于提高各種 GNU 和其他系統上的軟件包的可移植性。Gnulib 包含了一系列的模塊,每個模塊都提供一種功能,比如提供標準 C 庫中不存在的函數,或者提供一些平臺特有的功能的可移植替代實現。

  • 可移植性: Gnulib 的主要目標是解決各種操作系統之間的兼容性問題,特別是 Unix-like 系統和類似于 GNU 系統的環境。
  • 模塊化: 它包含了許多獨立的模塊,每個模塊都可以單獨使用。這些模塊通常包括函數、宏、類型定義和其他可以在多個項目之間共享的代碼。
  • 自動化工具: Gnulib 配有一個腳本,可以自動將所選擇的模塊集成到你的項目中。
  • 廣泛的功能: 它包括了大量的功能,從基本的字符串處理和文件操作到更高級的系統服務和抽象。
  • 與 Autotools 的集成: Gnulib 設計為與 GNU 構建系統(Autotools)緊密集成,方便在使用 Autoconf 和 Automake 的項目中利用 Gnulib。

使用 Gnulib 通常涉及以下步驟:

  1. 選擇模塊: 項目維護者首先確定他們的軟件需要哪些 Gnulib 模塊來解決可移植性問題或補充缺失功能。
  2. 集成模塊: 使用 Gnulib 提供的 gnulib-tool 腳本,將這些模塊的源代碼和其他必要文件復制或鏈接到主項目中。
  3. 配置構建系統: 更新項目的 configure.acMakefile.am 文件(如果使用 Autotools),以便在構建過程中包含和編譯 Gnulib 模塊。

與其他標準庫(如 glibc)不同,Gnulib 更側重于跨平臺的可移植性而不是系統特定的性能優化。此外,Gnulib 不是作為一個共享庫來安裝的,而是作為源代碼直接集成到你的項目中,這意味著它不會引入運行時依賴。

Gnulib 是許多 GNU 軟件和其他開源項目的基礎設施組件,因為它解決了許多在廣泛的環境中編寫可移植代碼時遇到的常見問題。

附錄: Gettext介紹

gettext 是一個國際化(i18n)和本地化(l10n)的工具集,它是 GNU 項目的一部分,用于使軟件能夠根據不同的語言和文化背景來適配其文本輸出。國際化通常指的是將軟件設計得能夠適應多種語言的過程,而本地化是指實際適配軟件到特定語言的過程。

  • 提取文本: gettext 工具可以從源代碼中提取出需要翻譯的字符串。
  • 編寫和管理翻譯: 它允許翻譯人員在不改變源代碼的情況下編寫翻譯(通常是以 .po 文件格式)。
  • 編譯翻譯: 翻譯完成后,gettext 可以將 .po 文件編譯成二進制的 .mo 文件,以便軟件在運行時使用。
  • 運行時支持: gettext 運行時庫支持軟件在運行時查找和使用正確的翻譯字符串。

在源代碼中,需要翻譯的字符串會被特殊的宏包圍,如 gettext("Message") 或簡寫的 _() 宏,例如 _ ("Message")。這些宏是標記這些字符串在運行時需要被翻譯的方式。

開發者使用 gettext 相關的工具來處理這些標記過的字符串:

  • xgettext: 從源代碼文件中提取帶有 gettext 標記的字符串,并創建 .pot(Portable Object Template)文件,這是一個包含所有待翻譯文本的模板。
  • msginit: 初始化一個新的 .po(Portable Object)文件,基于 .pot 文件,為特定語言準備翻譯。
  • msgmerge: 更新已有的 .po 文件,合并新的字符串變化。
  • msgfmt: 將 .po 文件編譯成 .mo(Machine Object)文件,讓軟件可以使用翻譯后的字符串。

本地化使用流程:

  1. 提取: 在開發過程中,通過 xgettext 從源代碼中提取所有需要翻譯的字符串。
  2. 初始化: 對于每種目標語言,使用 msginit 來初始化一個 .po 文件。
  3. 翻譯: 翻譯人員翻譯 .po 文件中的每個字符串。
  4. 編譯: 使用 msgfmt 將翻譯好的 .po 文件編譯成 .mo 文件。
  5. 安裝和使用: 將 .mo 文件安裝到系統的適當位置,軟件在運行時會自動使用這些文件中的翻譯字符串。

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

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

相關文章

FL Studio21最新FL水果編曲軟件中文版在哪下載?

FL Studio21水果編曲軟件是一款專業的音樂制作軟件,被廣泛地應用于電子音樂、hip-hop、流行樂等多種音樂類型的制作。該軟件提供了豐富的音頻編曲工具和音樂效果器,讓用戶可以輕松地創作出高品質的音樂作品。同時,這也是一款非常易于上手的軟…

[ 云計算 | Azure 實踐 ] 在 Azure 門戶中創建 VM 虛擬機并進行驗證

文章目錄 一、前言二、在 Azure Portal 中創建 VM三、驗證已創建的虛擬機資源3.1 方法一:在虛擬機服務中查看驗證3.1 方法二:在資源組服務中查看驗證 四、文末總結 一、前言 本文會開始創建新系列的專欄,專門更新 Azure 云實踐相關的文章。 …

7-7 求補碼

整數在內存中以二進制補碼形式存儲。對于給定的整數n,要求輸出其4個字節長的補碼。1個字節8個二進制位。 輸入格式: 輸入一個整數n(?231≤n≤231?1)。 輸出格式: 輸出n的補碼。 輸入樣例1: 123輸出樣例1: 00000000000000000000000001111011輸入樣例2: -12…

YOLOv8改進 | 2023檢測頭篇 | 利用AFPN改進檢測頭適配YOLOv8版(全網獨家創新)

一、本文介紹 本文給大家帶來的改進機制是利用今年新推出的AFPN(漸近特征金字塔網絡)來優化檢測頭,AFPN的核心思想是通過引入一種漸近的特征融合策略,將底層、高層和頂層的特征逐漸整合到目標檢測過程中。這種漸近融合方式有助于…

【react hook】ahook的useThrottleEffect 是干嘛的

import { useThrottleEffect } from ahooks;useThrottleEffect 是 React Hooks 中的一個自定義 Hook,用于創建具有節流效果的副作用函數。 在 React 組件中,副作用函數通常在組件生命周期方法中執行,如 componentDidMount、componentDidUpda…

軟件無線電SDR-頻譜采集python實現

sdr做的頻譜采集,保存的500張頻譜圖,能看出來是什么東西嗎?

VC++使用GetProcessTimes獲取進程創建時間、銷毀時間、用戶態時間、內核態時間

一、GetProcessTimes函數簡介(微軟MSDN) 微軟提供了一個非常有用的API函數GetProcessTimes用來獲取進程創建時間、銷毀時間、用戶態時間、內核態時間,msdn連接為:GetProcessTimes 函數 (processthreadsapi.h) 其函數原型為&#…

Linux內核--內存管理(六)補充--內核頁表及內核虛擬空間

目錄 一、引言 二、內核頁表的結構 ------>2.1、頁表項結構 ------>2.2、swapper_pg_dir ------>2.3、內核頁表布局 ------>2.4、物理/虛擬 地址轉換 ------>2.5、頁表容量及表項偏移 ------>2.6、表項掩碼及控制區域 ------>2.7、頁標志位 ---…

【測試發布】

學習目標: 提示:這里可以添加學習目標 例如: 一周掌握 Java 入門知識 學習內容: 提示:這里可以添加要學的內容 例如: 搭建 Java 開發環境掌握 Java 基本語法掌握條件語句掌握循環語句 學習時間&#x…

基于NIQE算法的圖像無參考質量評價算法matlab仿真

目錄 1.算法運行效果圖預覽 2.算法運行軟件版本 3.部分核心程序 4.算法理論概述 4.1 空域NSS特征提取 4.2 圖像塊選取 4.3 MVG模型 4.4 NIQE指標 5.算法完整程序工程 1.算法運行效果圖預覽 2.算法運行軟件版本 MATLAB2022a 3.部分核心程序 clc; clear; close all; …

輕量封裝WebGPU渲染系統示例<46>- 材質組裝管線(MaterialPipeline)燈光、陰影、霧以及多Pass(源碼)

當前示例源碼github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/material/src/voxgpu/sample/MaterialPipelineMultiPasses.ts 當前示例運行效果: 此示例基于此渲染系統實現,當前示例TypeScript源碼如下: export class MaterialPipelin…

Python----內置模塊

1、什么是Python模塊 Python 模塊(Module),是一個Python 文件,以 .py 結尾,包含了 Python 對象定義和Python語句。模塊能定義函數,類和變量,模塊里也能包含可執行的代碼。 2、模塊的分類 在Python中,模塊…

[ffmpeg] AVFrame 功能整理

背景 AVFrame 主要用來存儲編碼前的原始數據。 AVFrame 結構體 在 frame.h 文件中 主要變量 uint8_t *data[AV_NUM_DATA_POINTERS]; // 存儲每個 planes 的數據 int linesize[AV_NUM_DATA_POINTERS]; // 每一行的音視頻數據 uint8_t **extended_data; // 視頻,…

java實現網絡聊天

網絡聊天實現步驟(從功能談論方法): 客戶端: 1.登錄面板:注冊提醒用戶注冊格式,登錄賬號密碼不為空,點擊登錄的時候需要連接服務器端,啟動聊天面板。(監聽用戶點擊登錄…

Windows下nginx的啟動,重啟,關閉等功能bat腳本

echo off rem 提供Windows下nginx的啟動,重啟,關閉功能echo begincls ::ngxin 所在的盤符 set NGINX_PATHG:::nginx 所在目錄 set NGINX_DIRG:\projects\nginx-1.24.0\ color 0a TITLE Nginx 管理程序增強版CLSecho. echo. ** Nginx 管理程序 *** echo.…

JAVA使用HTTP代碼示例

你好,Java開發者們!今天,我要給你們帶來一場硬核的盛宴,那就是在Java中使用HTTP協議進行網絡通信的代碼示例。準備好接受挑戰了嗎?Lets go! 首先,我們需要導入一些必要的庫,它們將成…

C++枚舉類

枚舉 C11有作用域枚舉和無作用域枚舉 無作用域枚舉 特點 全局作用域:無作用域枚舉的成員(枚舉值)在包含它們的作用域內是直接可見的,不需要使用枚舉類型名稱作為前綴。 隱式類型轉換:無作用域枚舉的成員可以隱式地轉換…

鴻蒙開發組件之ForEach列表

一、ForEach函數 ForEach函數是一個迭代函數,需要傳遞兩個必須參數和一個可選參數。主要通過迭代來獲取參數arr中的數據不斷的生成單個Item來生成鴻蒙中的列表樣式 二、先創建單個的Item的UI 通過嵌套Row與Column來實現單個Item的UI。例如圖中沒有折扣的可以看成一…

用23種設計模式打造一個cocos creator的游戲框架----(八)適配器模式

1、模式標準 模式名稱:適配器模式 模式分類:結構型 模式意圖:適配器模式的意圖是將一個類的接口轉換成客戶端期望的另一個接口。適配器模式使原本接口不兼容的類可以一起工作。 結構圖: 適用于: 系統需要使用現有的…

309. 買賣股票的最佳時機含冷凍期(leetcode) 動態規劃思想

文章目錄 前言一、題目分析二、算法原理1.狀態表示2.狀態轉移方程3.初始化邊界條件4.填表順序5.返回值是什么 三、代碼實現總結 前言 在本文章中,我們將要詳細介紹一下Leetcode中買賣股票的最佳時機含冷凍期相關的內容,本題采用動態規劃的思想解決 一、…