<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>LingHui 的技术笔记</title><link>https://note.plhwiki.cn/</link><description>Recent content on LingHui 的技术笔记</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Tue, 20 Oct 2026 22:09:51 -0400</lastBuildDate><atom:link href="https://note.plhwiki.cn/index.xml" rel="self" type="application/rss+xml"/><item><title/><link>https://note.plhwiki.cn/reference/industry_term/</link><pubDate>Tue, 20 Oct 2026 22:09:51 -0400</pubDate><guid>https://note.plhwiki.cn/reference/industry_term/</guid><description>&lt;h1 id="技术术语"&gt;技术术语&lt;/h1&gt;
&lt;h2 id="最小可行性产品-minimum-viable-product"&gt;最小可行性产品 (Minimum Viable Product)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;定义&lt;/strong&gt;：指用&lt;strong&gt;最快的时间、最低的成本&lt;/strong&gt;开发出一个只包含&lt;strong&gt;核心功能&lt;/strong&gt;的产品原型，直接推向市场让真实用户使用，以此来验证这个产品的核心逻辑是否能跑通、用户是否愿意买单。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="软件即服务-software-as-a-service"&gt;软件即服务 (Software as a Service)&lt;/h2&gt;
&lt;p&gt;在 SaaS/互联网行业中：&lt;/p&gt;</description></item><item><title/><link>https://note.plhwiki.cn/tools/deploy/https/</link><pubDate>Tue, 20 Oct 2026 22:09:51 -0400</pubDate><guid>https://note.plhwiki.cn/tools/deploy/https/</guid><description>&lt;h1 id="https-配置"&gt;HTTPS 配置&lt;/h1&gt;
&lt;h2 id="配置https"&gt;配置HTTPS&lt;/h2&gt;
&lt;h3 id="安装-certbot"&gt;安装 Certbot：&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install -y snapd
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo snap install core
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo snap refresh core
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo snap install --classic certbot
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo ln -s /snap/bin/certbot /usr/local/bin/certbot
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="申请证书并自动配置-nginx"&gt;申请证书并自动配置 Nginx：&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo certbot --nginx -d note.plhwiki.cn
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;旧域名 &lt;code&gt;plhwiki.cn&lt;/code&gt;、&lt;code&gt;www.plhwiki.cn&lt;/code&gt; 的证书仍然保留，用于把 HTTPS 访问 301 跳转到 &lt;code&gt;note.plhwiki.cn&lt;/code&gt;。&lt;/p&gt;</description></item><item><title/><link>https://note.plhwiki.cn/ai/ai/</link><pubDate>Wed, 14 Oct 2026 20:01:02 +0800</pubDate><guid>https://note.plhwiki.cn/ai/ai/</guid><description>&lt;h1 id="claude"&gt;claude&lt;/h1&gt;
&lt;h2 id="claudemd"&gt;CLAUDE.md&lt;/h2&gt;
&lt;p&gt;CLAUDE.md 可按管理范围分层组织；这些文件作为上下文提供给模型，不能简单理解为 Git 配置那样的键值覆盖：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-scss" data-lang="scss"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;Managed&lt;/span&gt; &lt;span class="o"&gt;(/&lt;/span&gt;&lt;span class="nt"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nt"&gt;claude-code&lt;/span&gt;&lt;span class="o"&gt;/)&lt;/span&gt; &lt;span class="err"&gt;←&lt;/span&gt; &lt;span class="nt"&gt;企业管理员&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;↓&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;User&lt;/span&gt; &lt;span class="o"&gt;(~/&lt;/span&gt;&lt;span class="nc"&gt;.claude&lt;/span&gt;&lt;span class="o"&gt;/)&lt;/span&gt; &lt;span class="err"&gt;←&lt;/span&gt; &lt;span class="nt"&gt;个人全局&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;↓&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;Project&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;CLAUDE&lt;/span&gt;&lt;span class="nc"&gt;.md&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="err"&gt;←&lt;/span&gt; &lt;span class="nt"&gt;团队共享&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;↓&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;Local&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;CLAUDE&lt;/span&gt;&lt;span class="nc"&gt;.local.md&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="err"&gt;←&lt;/span&gt; &lt;span class="nt"&gt;个人私有&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="mcp"&gt;MCP&lt;/h2&gt;
&lt;p&gt;让 AI 工具能连接外部数据源和服务。把它想象成 Claude Code 的 USB 接口：插上不同的 MCP 服务器，Claude 就获得了对应的能力。&lt;/p&gt;</description></item><item><title/><link>https://note.plhwiki.cn/basic/com_protocl/</link><pubDate>Wed, 14 Oct 2026 20:01:02 +0800</pubDate><guid>https://note.plhwiki.cn/basic/com_protocl/</guid><description>&lt;h1 id="编码方式"&gt;编码方式&lt;/h1&gt;
&lt;h2 id="base64"&gt;Base64&lt;/h2&gt;
&lt;p&gt;​ 把任意二进制数据安全地表示成只含可打印 ASCII 字符的文本，便于在只支持文本的协议里传输，比如邮件 SMTP、HTTP、JSON 嵌入二进制、证书/密钥文本化等。它不是加密，也不是压缩；任何人都可以轻易还原&lt;/p&gt;</description></item><item><title/><link>https://note.plhwiki.cn/basic/security/</link><pubDate>Wed, 14 Oct 2026 20:01:02 +0800</pubDate><guid>https://note.plhwiki.cn/basic/security/</guid><description>&lt;h1 id="非对称加密"&gt;非对称加密&lt;/h1&gt;
&lt;p&gt;公钥密码使用一对相关的公钥和私钥。对于公钥加密方案，使用接收方公钥加密、接收方私钥解密；对于数字签名方案，使用签名方私钥签名、公钥验签。两类操作的目的和算法要求不同，不能把签名简单等同于“私钥加密”。&lt;/p&gt;</description></item><item><title/><link>https://note.plhwiki.cn/cpp/3rdpart/zltoolkit/</link><pubDate>Wed, 14 Oct 2026 20:01:02 +0800</pubDate><guid>https://note.plhwiki.cn/cpp/3rdpart/zltoolkit/</guid><description>&lt;h1 id="zltoolkit源码框架"&gt;ZLToolKit源码框架&lt;/h1&gt;
&lt;p&gt;主要分为Thread、Poller、Network、Util四大部分。&lt;/p&gt;
&lt;h1 id="thread文件夹"&gt;Thread文件夹&lt;/h1&gt;
&lt;h3 id="taskexecutorh"&gt;TaskExecutor.h&lt;/h3&gt;
&lt;p&gt;有&lt;strong&gt;cpu负载计算，Task函数指针模板，任务执行器管理，管理任务执行线程池&lt;/strong&gt;&lt;/p&gt;</description></item><item><title/><link>https://note.plhwiki.cn/cpp/language/c++11/</link><pubDate>Wed, 14 Oct 2026 20:01:02 +0800</pubDate><guid>https://note.plhwiki.cn/cpp/language/c++11/</guid><description>&lt;h1 id="基本"&gt;基本&lt;/h1&gt;
&lt;p&gt;函数定义&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;返回值类型&lt;/span&gt; &lt;span class="err"&gt;函数名&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;参数列表&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;//函数头
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;函数体&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;函数声明&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;返回值类型&lt;/span&gt; &lt;span class="err"&gt;函数名（参数列表）&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;函数类型&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c++" data-lang="c++"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;XmlFieldValue&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;field&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;返回类型&lt;/span&gt; &lt;span class="err"&gt;参数列表&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;↓&lt;/span&gt; &lt;span class="err"&gt;↓&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;XmlFieldValue&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="n"&gt;EncodeFunc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;XmlFieldValue&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="err"&gt;相当于给这个函数类型起了个名字&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="odr规则"&gt;ODR规则&lt;/h2&gt;
&lt;p&gt;ODR = &lt;strong&gt;One Definition Rule（单一定义规则）&lt;/strong&gt;,C++ 程序有一个核心规则：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;一个变量、函数、类型，在整个程序中必须满足定义规则&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title/><link>https://note.plhwiki.cn/cpp/language/concurrency/</link><pubDate>Wed, 14 Oct 2026 20:01:02 +0800</pubDate><guid>https://note.plhwiki.cn/cpp/language/concurrency/</guid><description>&lt;h1 id="线程管理的基础"&gt;线程管理的基础&lt;/h1&gt;
&lt;h2 id="启动线程"&gt;启动线程&lt;/h2&gt;
&lt;p&gt;std::thread 可传函数、函数对象、lambda&lt;/p&gt;
&lt;h3 id="正确写法"&gt;正确写法&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c++" data-lang="c++"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;background_task&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="cm"&gt;/* ... */&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="kr"&gt;thread&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;background_task&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 传函数指针，不要加 ()
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 或
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="kr"&gt;thread&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;background_task&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 显式取地址，等价
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;函数名在表达式中会 衰变为函数指针，正好符合 std::thread 对 callable 的要求。&lt;/p&gt;</description></item><item><title/><link>https://note.plhwiki.cn/cpp/language/template/</link><pubDate>Wed, 14 Oct 2026 20:01:02 +0800</pubDate><guid>https://note.plhwiki.cn/cpp/language/template/</guid><description>&lt;h1 id="可变参数模板"&gt;可变参数模板&lt;/h1&gt;
&lt;p&gt;声明可变参数模板的时候&lt;strong&gt;需要在typename或class 后面带上省略号&lt;code&gt;...&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;声明一个参数包，这个参数包中可以包含0到任意个板参数。&lt;/li&gt;
&lt;li&gt;在模板定义的右边，可以将参数包展开成一个一个独立的参数。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c++" data-lang="c++"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;typename&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;...(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ZLMediaKit的模板&lt;/p&gt;</description></item><item><title/><link>https://note.plhwiki.cn/database/sqlite3/</link><pubDate>Wed, 14 Oct 2026 20:01:02 +0800</pubDate><guid>https://note.plhwiki.cn/database/sqlite3/</guid><description>&lt;h1 id="命令行"&gt;命令行&lt;/h1&gt;
&lt;p&gt;SQLite CLI 的点命令以 &lt;code&gt;.&lt;/code&gt; 开始，单独占一行，不需要分号；SQL 语句通常以 &lt;code&gt;;&lt;/code&gt; 结束。点命令也不能追加 SQL 风格的行尾注释。&lt;/p&gt;
&lt;p&gt;SQLite 中「新建数据库」和「打开数据库」是同一个命令（文件不存在则创建，存在则打开）：&lt;/p&gt;</description></item><item><title/><link>https://note.plhwiki.cn/hardware/4g/</link><pubDate>Wed, 14 Oct 2026 20:01:02 +0800</pubDate><guid>https://note.plhwiki.cn/hardware/4g/</guid><description>&lt;h1 id="内核添加模块"&gt;内核添加模块&lt;/h1&gt;
&lt;p&gt;在 &lt;code&gt;drivers/usb/serial/option.c&lt;/code&gt;&lt;/p&gt;
&lt;h1 id="短信相关"&gt;短信相关&lt;/h1&gt;
&lt;p&gt;​ 发送短信的流程就是配置短信模式-&amp;gt;配置字符集-&amp;gt;下发发送命令-&amp;gt;等待，提示符-&amp;gt;发送正文/PDU -&amp;gt;发送ctrl+z &amp;ndash;&amp;gt;等待结果&lt;/p&gt;</description></item><item><title/><link>https://note.plhwiki.cn/hardware/flash/</link><pubDate>Wed, 14 Oct 2026 20:01:02 +0800</pubDate><guid>https://note.plhwiki.cn/hardware/flash/</guid><description>&lt;h1 id="概述与定义"&gt;概述与定义&lt;/h1&gt;
&lt;h2 id="spi-flash"&gt;SPI Flash&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;接口协议&lt;/strong&gt;（芯片与主机的通信方式）&lt;/p&gt;
&lt;h2 id="nor-flash"&gt;NOR Flash&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;NOR Flash&lt;/strong&gt;是一种非易失性存储器，采用&amp;quot;或非门&amp;quot;(NOR)架构。它的特点是支持随机访问，可以直接在芯片上执行代码(XIP)，常用于存储启动代码、固件等对可靠性要求较高的应用。&lt;/p&gt;</description></item><item><title/><link>https://note.plhwiki.cn/hardware/i2c/</link><pubDate>Wed, 14 Oct 2026 20:01:02 +0800</pubDate><guid>https://note.plhwiki.cn/hardware/i2c/</guid><description>&lt;h1 id="i2c"&gt;I2C&lt;/h1&gt;
&lt;p&gt;​ I2C（Inter-Integrated Circuit）协议是由Philips公司于1980年代提出的一种 &lt;strong&gt;同步、半双工、多主从结构&lt;/strong&gt; 的串行通信协议，广泛应用于嵌入式系统中的芯片间通信。其核心特点在于仅使用 两条信号线 ： &lt;strong&gt;SDA（数据线） 与 SCL（时钟线）&lt;/strong&gt; ，即可实现多个设备之间的可靠数据传输。&lt;/p&gt;</description></item><item><title/><link>https://note.plhwiki.cn/hardware/usb/</link><pubDate>Wed, 14 Oct 2026 20:01:02 +0800</pubDate><guid>https://note.plhwiki.cn/hardware/usb/</guid><description>&lt;h1 id="usb"&gt;USB&lt;/h1&gt;
&lt;h2 id="usb总线系统中的设备"&gt;USB总线系统中的设备&lt;/h2&gt;
&lt;p&gt;USB 是以主机为中心的分层星形拓扑（tiered star），从上到下依次是：主机（含根集线器）→ 集线器 → 外围设备。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://note.plhwiki.cn/hardware/assets/0280a0c9854063cd20bdbc4098b001c9.png" alt="USB总线拓扑" loading="lazy"&gt;
&lt;/p&gt;
&lt;h3 id="usb主机"&gt;USB主机&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;每条 USB 总线（一棵拓扑树）有且只有一个主机。一个 SoC 可以有多个主机控制器。A1 的三个 DWC2 控制器各注册一条总线；但不能推广为所有控制器都一对一，例如 xHCI 通常分别注册 USB 2 和 USB 3 两条逻辑总线。&lt;/li&gt;
&lt;li&gt;USB 2.0 的常规事务由主机调度，设备不能自行发起普通总线事务；远程唤醒等信号是另一回事。USB 3.x 还支持 ERDY 等设备通知，不能把“所有版本始终只能等待轮询”作为通用结论。&lt;/li&gt;
&lt;li&gt;主机按固定周期划分时间：每 1 ms 发一个 SOF（Start of Frame）包标识一帧；High Speed 下每帧再细分为 8 个 125 µs 的微帧（microframe）。&lt;/li&gt;
&lt;li&gt;负责枚举设备（分配地址、读取描述符、选择配置）、加载驱动，以及对总线上的错误进行管理和恢复。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="usb-root-hub根集线器"&gt;USB Root Hub（根集线器）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;集成在主机控制器内部，不是独立芯片，由 HCD（Host Controller Driver）在注册总线时虚拟出来。&lt;/li&gt;
&lt;li&gt;Linux 中设备名为 &lt;code&gt;usbN&lt;/code&gt;（N 为总线号），接口为 &lt;code&gt;N-0:1.0&lt;/code&gt;，绑定 &lt;code&gt;hub&lt;/code&gt; 驱动。&lt;/li&gt;
&lt;li&gt;VID:PID 固定为 Linux Foundation 的虚拟 ID：&lt;code&gt;1d6b:0001&lt;/code&gt;（USB 1.1）、&lt;code&gt;1d6b:0002&lt;/code&gt;（USB 2.0）、&lt;code&gt;1d6b:0003&lt;/code&gt;（USB 3.x）。&lt;/li&gt;
&lt;li&gt;端口数等于控制器的物理端口数，见 sysfs 的 &lt;code&gt;maxchild&lt;/code&gt;。君正A1 每个控制器只有 1 个端口。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;product&lt;/code&gt;、&lt;code&gt;manufacturer&lt;/code&gt; 由内核填写，A1 上分别是 &lt;code&gt;DWC OTG Controller&lt;/code&gt;、&lt;code&gt;Linux 4.4.94-20220517 dwc2_hsotg&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;对应的启动日志：&lt;/p&gt;</description></item><item><title/><link>https://note.plhwiki.cn/linux/chip/a1/</link><pubDate>Wed, 14 Oct 2026 20:01:02 +0800</pubDate><guid>https://note.plhwiki.cn/linux/chip/a1/</guid><description>&lt;h1 id="uboot"&gt;Uboot&lt;/h1&gt;
&lt;p&gt;tftp 烧写&lt;/p&gt;
&lt;p&gt;以下地址和大小仅适用于当时的分区表。预填充 0xff 要使用 mw.b，count 才按字节计；默认 mw 通常按 32 位单元写入，相同 count 会覆盖四倍的内存范围。烧写前还需确认 TFTP 成功且镜像大小未超过分区。&lt;/p&gt;</description></item><item><title/><link>https://note.plhwiki.cn/linux/drive/dts/</link><pubDate>Wed, 14 Oct 2026 20:01:02 +0800</pubDate><guid>https://note.plhwiki.cn/linux/drive/dts/</guid><description>&lt;h1 id="平台设备驱动程序"&gt;平台设备驱动程序&lt;/h1&gt;
&lt;h2 id="片上设备"&gt;片上设备&lt;/h2&gt;
&lt;p&gt;物理存在于 SoC 内部的硬件模块，其特点是焊死在芯片内部，不可插拔，不可枚举(无discovery机制)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;UART 控制器&lt;/li&gt;
&lt;li&gt;I2C 控制器&lt;/li&gt;
&lt;li&gt;SPI 控制器&lt;/li&gt;
&lt;li&gt;GPIO&lt;/li&gt;
&lt;li&gt;Timer&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="平台设备"&gt;平台设备&lt;/h2&gt;
&lt;h1 id="设备树"&gt;设备树&lt;/h1&gt;
&lt;p&gt;**DTS（Device Tree Source）：**DTS 是设备树的源文件，采用一种类似于文本的语法来描述硬件设备的结构、属性和连接关系&lt;/p&gt;</description></item><item><title/><link>https://note.plhwiki.cn/linux/drive/tty/</link><pubDate>Wed, 14 Oct 2026 20:01:02 +0800</pubDate><guid>https://note.plhwiki.cn/linux/drive/tty/</guid><description>&lt;h1 id="tty终端"&gt;TTY终端&lt;/h1&gt;
&lt;h2 id="终端"&gt;终端&lt;/h2&gt;
&lt;p&gt;终端是一个电子（或电气）设备，用于向系统输入数据（input），或者将系统接收到的数据显示出来（output），即我们常说的“人机交互设备”。
TTY(Teletypewriter)代表终端设备的概念，它允许用户与系统进行交互，在Linux中，TTY可分为如下几类:&lt;/p&gt;</description></item><item><title/><link>https://note.plhwiki.cn/multimedia/basic/basic/</link><pubDate>Wed, 14 Oct 2026 20:01:02 +0800</pubDate><guid>https://note.plhwiki.cn/multimedia/basic/basic/</guid><description>&lt;h1 id="未压缩的原始图像"&gt;未压缩的原始图像&lt;/h1&gt;
&lt;h2 id="yuv420"&gt;YUV420&lt;/h2&gt;
&lt;p&gt;YUV420是描述色度采样的方式&lt;/p&gt;
&lt;h3 id="nv12"&gt;NV12&lt;/h3&gt;
&lt;p&gt;NV12 属于 YUV420SP 格式，包含两个 Plane（平面）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Y Plane：亮度数据，每个像素一个 Y 分量。&lt;/li&gt;
&lt;li&gt;UV Plane：色度数据，U 和 V 交错存储，每个 2×2 像素块共用一组 UV。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;描述Y/U/V 数据在内存里怎么排：&lt;/p&gt;</description></item><item><title/><link>https://note.plhwiki.cn/multimedia/basic/framebuffer/</link><pubDate>Wed, 14 Oct 2026 20:01:02 +0800</pubDate><guid>https://note.plhwiki.cn/multimedia/basic/framebuffer/</guid><description>&lt;h1 id="分辨率"&gt;分辨率&lt;/h1&gt;
&lt;h2 id="显示分辨率"&gt;显示分辨率&lt;/h2&gt;
&lt;p&gt;也就是vo输出分辨率，最终HDMI真正输出给显示器的分辨率&lt;/p&gt;
&lt;h2 id="图形层分辨率"&gt;图形层分辨率&lt;/h2&gt;
&lt;p&gt;也就是framebuffer分辨率，应用程序实际绘图时使用的画布分辨率&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;图形层 framebuffer：1920 × 1080
↓
VO 硬件缩放
↓
HDMI 最终输出：3840 × 2160
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;视频层与图形层通常作为并行输入，由 VO 合成后输出，并非视频层先经过 framebuffer 图形层：&lt;/p&gt;</description></item><item><title/><link>https://note.plhwiki.cn/multimedia/protocol/gb28181/</link><pubDate>Wed, 14 Oct 2026 20:01:02 +0800</pubDate><guid>https://note.plhwiki.cn/multimedia/protocol/gb28181/</guid><description>&lt;h1 id="gb28181协议"&gt;GB28181协议&lt;/h1&gt;
&lt;p&gt;GB28181协议会话通道实际上使用的是SIP协议，并且在 SIP 的基础上规定了监控联网的标准化使用方式；具体厂商还可能增加私有扩展。SIP是一个由IETF MMUSIC工作组开发的协议，作为标准被提议用于创建，修改和终止包括视频，语音，即时通信，在线游戏和虚拟现实等多种多媒体元素在内的交互式用户会话。SIP中一个比较重要的概念是&lt;strong&gt;用户代理（User Agent）&lt;/strong&gt;，指的是一个SIP逻辑网络端点，用于创建、发送、接收SIP消息并管理一个SIP会话。SIP用户代理又可分为用户代理客户端UAC（User Agent Client）和用户代理服务端UAS（User Agent Server）。UAC创建并发送SIP请求，UAS接收处理SIP请求，发送SIP响应。SIP协议会与许多其它的协议协同工作，如SIP报文内容发送会话描述协议（Session Description Protocol，SDP）4，SDP协议描述了会话所使用流媒体细节，如：使用哪个IP端口，采用哪种编解码器等等。SIP的一个典型用途是：SIP会话传输一些简单的经过报文的实时传输协议流，RTP本身才是语音或视频的载体。在GB28181协议中，联网系统在进行视音频传输及控制时应建立两个传输通道: 会话通道和媒体流通道。会话通道用于在设备之间建立会话并传输系统控制命令; 媒体流通道用于传输视音频数据， 经过压缩编码的视音频流采用流媒体协议RTP/RTCP传输。GB28181协议中具体通信协议结构图如下图所示：&lt;/p&gt;</description></item><item><title/><link>https://note.plhwiki.cn/multimedia/protocol/media_protocol/</link><pubDate>Wed, 14 Oct 2026 20:01:02 +0800</pubDate><guid>https://note.plhwiki.cn/multimedia/protocol/media_protocol/</guid><description>&lt;h1 id="流媒体协议"&gt;流媒体协议&lt;/h1&gt;
&lt;p&gt;&lt;img src="https://note.plhwiki.cn/multimedia/protocol/assets/image-20260520092716153.png" alt="image-20260520092716153" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;RTSP 在上层&lt;strong&gt;发号施令&lt;/strong&gt;（管控制），RTP 在底层&lt;strong&gt;埋头搬砖&lt;/strong&gt;（运数据），RTCP 在旁边&lt;strong&gt;盯着质量&lt;/strong&gt;（做监督）&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;三者关系：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;RTSP&lt;/strong&gt;：控制播放、暂停和会话参数；RTP/RTCP 还可通过 RTSP 的 TCP 连接交错传输，不能理解为控制连接一定不承载媒体字节。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RTP&lt;/strong&gt;：封装媒体载荷、时间戳和序列号，常运行于 UDP 之上，也可使用 TCP 等承载；RTP 本身不保证可靠、有序或按时送达。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RTCP&lt;/strong&gt;：发送传输质量、同步和参与者信息；NACK 等反馈属于扩展机制，是否重传或调整码率由协议协商和实现决定。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;传统 RTP/UDP 会话通常使用偶数 RTP 端口及相邻的奇数 RTCP 端口，但这是常见约定。SDP 可以明确协商 RTCP 端口，rtcp-mux 还允许两者共用同一端口：&lt;/p&gt;</description></item><item><title/><link>https://note.plhwiki.cn/multimedia/v4l2/v4l2/</link><pubDate>Wed, 14 Oct 2026 20:01:02 +0800</pubDate><guid>https://note.plhwiki.cn/multimedia/v4l2/v4l2/</guid><description>&lt;h1 id="v4l2-框架核心概念"&gt;V4L2 框架核心概念&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Video for Linux 2 (V4L2)&lt;/strong&gt; 是 Linux 内核中处理视频设备的标准框架，用于统一管理摄像头、视频采集卡等设备。设计 V4L2 框架的核心目的（思想）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;用户空间和内核空间分离&lt;/strong&gt;：应用通过标准系统调用与内核交互&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;设备抽象&lt;/strong&gt;：视频采集／输出通常使用 &lt;code&gt;/dev/videoX&lt;/code&gt;；子设备等还可使用 &lt;code&gt;/dev/v4l-subdevX&lt;/code&gt; 等节点&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;缓冲区队列管理&lt;/strong&gt;：通过 &lt;code&gt;vb2_queue&lt;/code&gt; 实现高效的零拷贝数据传输&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;v4l2_device&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;device&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;media_device&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;mdev&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;list_head&lt;/span&gt; &lt;span class="n"&gt;subdevs&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;spinlock_t&lt;/span&gt; &lt;span class="n"&gt;lock&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;notify&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;v4l2_subdev&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;sd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;notification&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;arg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;v4l2_ctrl_handler&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ctrl_handler&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;v4l2_prio_state&lt;/span&gt; &lt;span class="n"&gt;prio&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;kref&lt;/span&gt; &lt;span class="n"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;release&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;v4l2_device&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;v4l2_dev&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;获取当前的格式&lt;/p&gt;</description></item><item><title/><link>https://note.plhwiki.cn/tools/build/cmake/</link><pubDate>Wed, 14 Oct 2026 20:01:02 +0800</pubDate><guid>https://note.plhwiki.cn/tools/build/cmake/</guid><description>&lt;h1 id="cmake-学习笔记"&gt;CMake 学习笔记&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;目录&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#%e5%bf%ab%e9%80%9f%e5%85%a5%e9%97%a8"&gt;快速入门&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#cmake-%e5%b7%a5%e4%bd%9c%e5%8e%9f%e7%90%86"&gt;CMake 工作原理&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#%e5%ae%89%e8%a3%85%e6%8c%87%e5%ae%9a%e7%89%88%e6%9c%ac-cmake%e6%ba%90%e7%a0%81%e7%bc%96%e8%af%91"&gt;安装指定版本 CMake（源码编译）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#out-of-source-%e6%9e%84%e5%bb%ba%e8%a7%84%e8%8c%83"&gt;out-of-source 构建规范&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#%e7%ac%ac%e4%b8%80%e4%b8%aa-cmakeliststxt"&gt;第一个 CMakeLists.txt&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#%e5%8f%98%e9%87%8f%e4%b8%8e%e6%b5%81%e7%a8%8b%e6%8e%a7%e5%88%b6"&gt;变量与流程控制&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#%e5%8f%98%e9%87%8f%e4%bd%bf%e7%94%a8"&gt;变量使用&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#%e8%b7%af%e5%be%84%e7%9b%b8%e5%85%b3%e5%8f%98%e9%87%8f"&gt;路径相关变量&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#cmake-%e8%87%aa%e5%b8%a6%e5%8f%98%e9%87%8f"&gt;CMake 自带变量&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#if-%e6%b5%81%e7%a8%8b%e6%8e%a7%e5%88%b6"&gt;if 流程控制&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#cache-%e7%bc%93%e5%ad%98%e5%8f%98%e9%87%8f"&gt;cache 缓存变量&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#include-%e7%94%a8%e6%b3%95"&gt;include 用法&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#%e6%8b%ac%e5%8f%b7%e6%b3%a8%e9%87%8a"&gt;括号注释&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#%e5%b1%9e%e6%80%a7"&gt;属性&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#%e6%9e%84%e5%bb%ba%e9%85%8d%e7%bd%ae%e4%b8%8e%e6%97%a5%e5%bf%97"&gt;构建配置与日志&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#%e7%bc%96%e8%af%91%e7%b1%bb%e5%9e%8b%e4%b8%8e-c-%e6%a0%87%e5%87%86"&gt;编译类型与 C++ 标准&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#%e8%bf%bd%e5%8a%a0%e7%bc%96%e8%af%91%e9%80%89%e9%a1%b9"&gt;追加编译选项&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#%e6%94%b6%e9%9b%86%e6%ba%90%e6%96%87%e4%bb%b6"&gt;收集源文件&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#%e8%be%93%e5%87%ba%e8%b7%af%e5%be%84%e8%ae%be%e7%bd%ae"&gt;输出路径设置&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#%e7%94%9f%e6%88%90-compile_commandsjson"&gt;生成 compile_commands.json&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#%e5%88%86%e6%ad%a5%e7%bc%96%e8%af%91%e4%b8%8e%e6%b8%85%e7%90%86%e6%8c%87%e5%ae%9a-target"&gt;分步编译与清理指定 target&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#%e8%b0%83%e8%af%95%e6%89%93%e5%8d%b0%e7%94%9f%e6%88%90%e7%9a%84%e5%85%b7%e4%bd%93%e6%8c%87%e4%bb%a4"&gt;调试：打印生成的具体指令&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#message-%e7%94%a8%e6%b3%95"&gt;message 用法&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#target-%e4%b8%8e%e4%be%9d%e8%b5%96%e7%ae%a1%e7%90%86"&gt;Target 与依赖管理&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#add_library%e5%88%9b%e5%bb%ba%e5%ba%93%e7%9b%ae%e6%a0%87"&gt;add_library（创建库目标）&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#%e5%af%bc%e5%85%a5%e5%a4%96%e9%83%a8%e5%ba%93imported"&gt;导入外部库：IMPORTED&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#target_include_directories"&gt;target_include_directories&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#target_link_libraries%e4%be%9d%e8%b5%96%e4%bc%a0%e6%92%ad"&gt;target_link_libraries（依赖传播）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#%e9%93%be%e6%8e%a5%e9%a2%84%e7%bc%96%e8%af%91%e7%9a%84%e7%ac%ac%e4%b8%89%e6%96%b9%e5%ba%93a--so"&gt;链接预编译的第三方库（.a / .so）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#set_target_properties"&gt;set_target_properties&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#find_package-%e4%b8%8e%e5%af%bc%e5%85%a5%e7%9b%ae%e6%a0%87"&gt;find_package 与导入目标&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#%e7%94%9f%e6%88%90%e5%99%a8%e8%a1%a8%e8%be%be%e5%bc%8f%e5%9f%ba%e7%a1%80"&gt;生成器表达式基础&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#install"&gt;install&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#%e4%ba%a4%e5%8f%89%e7%bc%96%e8%af%91%e4%b8%8e-toolchain"&gt;交叉编译与 Toolchain&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#cmake-toolchain-%e6%96%87%e4%bb%b6"&gt;CMake toolchain 文件&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#makefile-%e4%ba%a4%e5%8f%89%e7%bc%96%e8%af%91%e8%a6%81%e7%82%b9"&gt;Makefile 交叉编译要点&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#pkg-config-%e4%ba%a4%e5%8f%89%e7%bc%96%e8%af%91"&gt;pkg-config 交叉编译&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#%e4%ba%a7%e7%89%a9%e6%a0%a1%e9%aa%8c"&gt;产物校验&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#%e5%b7%a5%e5%85%b7%e9%93%be%e7%9b%ae%e5%bd%95%e7%bb%93%e6%9e%84"&gt;工具链目录结构&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="快速入门"&gt;快速入门&lt;/h2&gt;
&lt;h3 id="cmake-工作原理"&gt;CMake 工作原理&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://note.plhwiki.cn/tools/build/assets/image-20241217185914285.png" alt="CMake 生成构建文件并调用构建工具的流程图" loading="lazy"&gt;
&lt;/p&gt;</description></item><item><title/><link>https://note.plhwiki.cn/tools/build/makefile/</link><pubDate>Wed, 14 Oct 2026 20:01:02 +0800</pubDate><guid>https://note.plhwiki.cn/tools/build/makefile/</guid><description>&lt;h1 id="make"&gt;Make&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;面向 Linux / C/C++ / 交叉编译（ARM、MIPS uClibc 工具链）的构建笔记。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="make-基础概念"&gt;Make 基础概念&lt;/h2&gt;
&lt;p&gt;Make 通过比较**目标（target）与其依赖（prerequisite）的修改时间（mtime）**决定是否重建：只要任一依赖比目标新，就执行该目标的命令，并沿依赖图递归向上。&lt;/p&gt;</description></item><item><title/><link>https://note.plhwiki.cn/tools/debug/asan/</link><pubDate>Wed, 14 Oct 2026 20:01:02 +0800</pubDate><guid>https://note.plhwiki.cn/tools/debug/asan/</guid><description>&lt;h1 id="内存错误检查"&gt;内存错误检查&lt;/h1&gt;
&lt;h2 id="addresssanitizerasan"&gt;AddressSanitizer（ASan）&lt;/h2&gt;
&lt;p&gt;下面日志中的 &lt;code&gt;heap-buffer-overflow&lt;/code&gt; 是堆缓冲区越界写，不是内存泄漏。ASan 主要检测越界、释放后使用等错误；泄漏检测由 LeakSanitizer 提供，在部分平台可与 ASan 集成。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;g++ -fsanitize&lt;span class="o"&gt;=&lt;/span&gt;address -o test_asan memory.cpp -g
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;plh@plh-virtual-machine:~/work/MyProject/c++/plh/DataStructrues/1.linear_List$ ./test_asan
=================================================================
==12293==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x602000000018 at pc 0x5578e1a712ff bp 0x7ffe0f40ead0 sp 0x7ffe0f40eac0
WRITE of size 4 at 0x602000000018 thread T0
#0 0x5578e1a712fe in func() /home/plh/work/MyProject/c++/plh/DataStructrues/1.linear_List/memory.cpp:6
#1 0x5578e1a71314 in main /home/plh/work/MyProject/c++/plh/DataStructrues/1.linear_List/memory.cpp:11
#2 0x7fdbb00f2082 in __libc_start_main ../csu/libc-start.c:308
#3 0x5578e1a711ad in _start (/home/plh/work/MyProject/c++/plh/DataStructrues/1.linear_List/test_asan+0x11ad)
0x602000000018 is located 4 bytes to the right of 4-byte region [0x602000000010,0x602000000014)
allocated by thread T0 here:
#0 0x7fdbb071b587 in operator new(unsigned long) ../../../../src/libsanitizer/asan/asan_new_delete.cc:104
#1 0x5578e1a7127e in func() /home/plh/work/MyProject/c++/plh/DataStructrues/1.linear_List/memory.cpp:5
#2 0x5578e1a71314 in main /home/plh/work/MyProject/c++/plh/DataStructrues/1.linear_List/memory.cpp:11
#3 0x7fdbb00f2082 in __libc_start_main ../csu/libc-start.c:308
SUMMARY: AddressSanitizer: heap-buffer-overflow /home/plh/work/MyProject/c++/plh/DataStructrues/1.linear_List/memory.cpp:6 in func()
Shadow bytes around the buggy address:
0x0c047fff7fb0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0c047fff7fc0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0c047fff7fd0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0c047fff7fe0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0c047fff7ff0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
=&amp;gt;0x0c047fff8000: fa fa 04[fa]fa fa fa fa fa fa fa fa fa fa fa fa
0x0c047fff8010: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x0c047fff8020: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x0c047fff8030: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x0c047fff8040: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x0c047fff8050: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
Shadow byte legend (one shadow byte represents 8 application bytes):
Addressable: 00
Partially addressable: 01 02 03 04 05 06 07
Heap left redzone: fa
Freed heap region: fd
Stack left redzone: f1
Stack mid redzone: f2
Stack right redzone: f3
Stack after return: f5
Stack use after scope: f8
Global redzone: f9
Global init order: f6
Poisoned by user: f7
Container overflow: fc
Array cookie: ac
Intra object redzone: bb
ASan internal: fe
Left alloca redzone: ca
Right alloca redzone: cb
Shadow gap: cc
==12293==ABORTING
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title/><link>https://note.plhwiki.cn/tools/debug/gdb/</link><pubDate>Wed, 14 Oct 2026 20:01:02 +0800</pubDate><guid>https://note.plhwiki.cn/tools/debug/gdb/</guid><description>&lt;h1 id="gdb调试"&gt;gdb调试&lt;/h1&gt;
&lt;p&gt;问题：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;arm-mol-linux-uclibcgnueabihf-gdb: loadlocale.c:130: _nl_intern_locale_data: Assertion `cnt &amp;lt; (sizeof (_nl_value_type_LC_TIME) / sizeof (_nl_value_type_LC_TIME[0]))&amp;#39; failed.
Aborted (core dumped)
&lt;/code&gt;&lt;/pre&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;在运行GDB前临时修改locale环境变量，可以有效避免此问题：
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;LC_ALL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;C
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;LANG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;C
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;在启动 gdb 时传递参数&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;使用 &lt;code&gt;--args&lt;/code&gt; 选项启动 gdb&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;gdb --args ./main 10001 /home/meian/work/MyProject/study/reator/reatorHttp/readme/
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;在 gdb 内部设置参数&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;启动 gdb 后，使用 &lt;code&gt;set args&lt;/code&gt; 命令设置参数，然后运行&lt;/p&gt;</description></item><item><title/><link>https://note.plhwiki.cn/tools/docker/</link><pubDate>Wed, 14 Oct 2026 20:01:02 +0800</pubDate><guid>https://note.plhwiki.cn/tools/docker/</guid><description>&lt;h1 id="docker"&gt;Docker&lt;/h1&gt;
&lt;h2 id="配置"&gt;配置&lt;/h2&gt;
&lt;h3 id="国内镜像"&gt;国内镜像&lt;/h3&gt;
&lt;p&gt;在Docker daemon 的全局配置文件&lt;code&gt; /etc/docker/daemon.json&lt;/code&gt;写入：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;registry-mirrors&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;https://mirror.ccs.tencentyun.com&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;配置完重启docker &lt;code&gt;sudo systemctl restart docker&lt;/code&gt;&lt;/p&gt;
&lt;h2 id="docker的client"&gt;Docker的client&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;你输入命令
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker pull nginx
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Docker CLI
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/usr/bin/docker
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ /var/run/docker.sock
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Docker daemon
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dockerd
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ 读取
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/etc/docker/daemon.json
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Registry Mirror
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;腾讯云镜像站
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id="常用命令"&gt;常用命令&lt;/h1&gt;
&lt;h2 id="镜像类"&gt;镜像类&lt;/h2&gt;
&lt;h3 id="查看镜像"&gt;查看镜像&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker images
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="拉取镜像"&gt;拉取镜像&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker pull
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker pull mysql &lt;span class="c1"&gt;# 未指定标签时使用 latest；latest 是普通标签，不保证代表最新发布版本&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="运行镜像"&gt;运行镜像&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run tomcat
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="容器类"&gt;容器类&lt;/h2&gt;
&lt;h3 id="查看正在运行的容器"&gt;查看正在运行的容器&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker ps
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker ps -a &lt;span class="c1"&gt;# 查看所有容器&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#加格式化方式访问，格式会更加清爽&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker ps --format &lt;span class="s2"&gt;&amp;#34;table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="停止容器"&gt;停止容器&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker stop 容器名
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker stop nginx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="启动容器"&gt;启动容器&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker start 容器名
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker start nginx
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker restart 容器名
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker restart nginx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="删除容器"&gt;删除容器&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#删除一个&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker rm 容器ID
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker rm nginx
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker rm -f 容器ID &lt;span class="c1"&gt;#强制删除&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker rm -f nginx
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#删除多个&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker rm -f &lt;span class="k"&gt;$(&lt;/span&gt;docker ps -a -q&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;或
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker ps -a -q &lt;span class="p"&gt;|&lt;/span&gt; xargs docker rm
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;参考：&lt;a href="https://docs.docker.com/reference/cli/docker/image/pull/"&gt;docker image pull&lt;/a&gt;。&lt;/p&gt;</description></item><item><title/><link>https://note.plhwiki.cn/tools/git/</link><pubDate>Wed, 14 Oct 2026 20:01:02 +0800</pubDate><guid>https://note.plhwiki.cn/tools/git/</guid><description>&lt;p&gt;相关笔记：&lt;a href="https://note.plhwiki.cn/tools/debug/gdb/"&gt;GDB 调试&lt;/a&gt;、&lt;a href="https://note.plhwiki.cn/tools/debug/asan/"&gt;ASan 内存检查&lt;/a&gt;、&lt;a href="https://note.plhwiki.cn/reference/%E5%AD%A6%E4%B9%A0%E8%B5%84%E6%BA%90/"&gt;学习资源&lt;/a&gt;。&lt;/p&gt;
&lt;h1 id="git"&gt;Git&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://learngitbranching.js.org/?locale=zh_CN"&gt;https://learngitbranching.js.org/?locale=zh_CN&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://note.plhwiki.cn/tools/assets/image-20240111143435610.png" alt="image-20240111143435610" loading="lazy"&gt;
&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="git的三个区域"&gt;Git的三个区域&lt;/h2&gt;
&lt;p&gt;Git 的文件有三种状态区域：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;区域&lt;/th&gt;
&lt;th&gt;命令&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;工作区 (Working Directory)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;你编辑的实际文件&lt;/td&gt;
&lt;td&gt;改动还没 &lt;code&gt;add&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;暂存区 (Staging Area/index)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;用 &lt;code&gt;git add&lt;/code&gt; 后进入这里&lt;/td&gt;
&lt;td&gt;等待被 &lt;code&gt;commit&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;本地仓库 (Repository)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;用 &lt;code&gt;git commit&lt;/code&gt; 后进入这里&lt;/td&gt;
&lt;td&gt;已经记录在历史中&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;对应命令区别：&lt;/p&gt;</description></item><item><title/><link>https://note.plhwiki.cn/cpp/design/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/</link><pubDate>Wed, 14 Oct 2026 08:00:23 -0400</pubDate><guid>https://note.plhwiki.cn/cpp/design/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/</guid><description>&lt;h1 id="单例模式"&gt;单例模式&lt;/h1&gt;
&lt;h2 id="service-locator"&gt;Service Locator&lt;/h2&gt;
&lt;p&gt;这实际上是属于一种&lt;strong&gt;全局获取依赖对象&lt;/strong&gt;的设计模式，可以理解为“我不通过构造函数传进来，而是到一个全局注册中心里去拿对象。”&lt;/p&gt;
&lt;h2 id="meyers-singleton"&gt;Meyer&amp;rsquo;s Singleton&lt;/h2&gt;
&lt;p&gt;经典代码（C++11 起，函数局部 static 的首次初始化具有线程安全保证，但不代表对象后续的所有操作都线程安全）：&lt;/p&gt;</description></item><item><title/><link>https://note.plhwiki.cn/tools/build/%E7%BC%96%E8%AF%91%E5%99%A8/</link><pubDate>Wed, 14 Oct 2026 08:00:23 -0400</pubDate><guid>https://note.plhwiki.cn/tools/build/%E7%BC%96%E8%AF%91%E5%99%A8/</guid><description>&lt;p&gt;现代编译器通常采用“三段式”架构，分为：&lt;strong&gt;前端（Frontend）、中端（Optimizer，优化器）和后端（Backend，代码生成器）&lt;/strong&gt;。前端的任务是把程序员编写的、具备特定语法的高级语言源代码（如 C++、Java、Python），翻译成一种与具体硬件平台无关的&lt;strong&gt;中间表示（IR，Intermediate Representation）&lt;/strong&gt;，同时检查代码中的语法和语义错误。&lt;/p&gt;</description></item><item><title/><link>https://note.plhwiki.cn/learning/c++%E4%B9%8B%E7%BE%8E/</link><pubDate>Wed, 14 Oct 2026 08:00:22 -0400</pubDate><guid>https://note.plhwiki.cn/learning/c++%E4%B9%8B%E7%BE%8E/</guid><description>&lt;h1 id="dont-hurt-yourself"&gt;Don&amp;rsquo;t hurt yourself&lt;/h1&gt;
&lt;h2 id="减少函数参数"&gt;减少函数参数&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;函数参数过多，是复杂度失控的信号。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;当一个函数不断需要增加参数时，不要急着继续加参数，而应先检查：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;函数是否承担了过多职责&lt;/strong&gt;，需要拆分；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多个参数是否属于同一个概念&lt;/strong&gt;，可以封装成结构体/参数对象；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;不同使用场景是否应该用不同函数、重载或模板表达&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;只有以上方式都不合适时，才考虑增加新参数。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最终目标是：&lt;/p&gt;</description></item><item><title/><link>https://note.plhwiki.cn/learning/%E7%A8%8B%E5%BA%8F%E5%91%98%E8%87%AA%E6%88%91%E4%BF%AE%E5%85%BB/</link><pubDate>Wed, 14 Oct 2026 08:00:22 -0400</pubDate><guid>https://note.plhwiki.cn/learning/%E7%A8%8B%E5%BA%8F%E5%91%98%E8%87%AA%E6%88%91%E4%BF%AE%E5%85%BB/</guid><description>&lt;h1 id="目标文件"&gt;目标文件&lt;/h1&gt;
&lt;h2 id="目标文件的格式"&gt;目标文件的格式&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ELF 文件类型&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;th&gt;实例&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;可重定位文件（ET_REL）&lt;/td&gt;
&lt;td&gt;包含待链接的代码、数据和重定位信息&lt;/td&gt;
&lt;td&gt;Linux 的 &lt;code&gt;.o&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;可执行文件（ET_EXEC）&lt;/td&gt;
&lt;td&gt;可装载执行的文件类型&lt;/td&gt;
&lt;td&gt;非 PIE 的 ELF 可执行程序&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;共享目标文件（ET_DYN）&lt;/td&gt;
&lt;td&gt;用于共享库，也用于 PIE 可执行程序；能否直接运行取决于文件用途和装载要求&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.so&lt;/code&gt;、PIE 可执行程序&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;核心转储文件（ET_CORE）&lt;/td&gt;
&lt;td&gt;记录进程崩溃时的内存与执行状态&lt;/td&gt;
&lt;td&gt;&lt;code&gt;core&lt;/code&gt; 文件&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;静态库 &lt;code&gt;.a&lt;/code&gt; 通常是多个目标文件组成的归档，不是单个 ET_REL 文件。Windows 的 &lt;code&gt;.obj&lt;/code&gt;、&lt;code&gt;.exe&lt;/code&gt;、&lt;code&gt;.dll&lt;/code&gt; 仅可作用途类比，通常采用 COFF／PE 格式，不属于 ELF。&lt;/p&gt;</description></item><item><title/><link>https://note.plhwiki.cn/learning/%E8%BD%AF%E4%BB%B6%E8%AE%BE%E8%AE%A1%E5%93%B2%E5%AD%A6/</link><pubDate>Wed, 14 Oct 2026 08:00:22 -0400</pubDate><guid>https://note.plhwiki.cn/learning/%E8%BD%AF%E4%BB%B6%E8%AE%BE%E8%AE%A1%E5%93%B2%E5%AD%A6/</guid><description>&lt;h1 id="复杂性的本质"&gt;复杂性的本质&lt;/h1&gt;
&lt;h2 id="复杂性的定义"&gt;复杂性的定义&lt;/h2&gt;
&lt;p&gt;复杂性&lt;strong&gt;是指与软件系统结构有关的，使人难以理解和修改系统的所有因素。&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;难以理解代码怎么工作 （理解）&lt;/li&gt;
&lt;li&gt;难以在修bug时避免引入其他bug （修改）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;从成本的角度上看，复杂系统小的修改需要耗费大量人力物力，而简单的系统，只需要较少的精力就能实现较大的改进&lt;/p&gt;</description></item><item><title/><link>https://note.plhwiki.cn/linux/api/%E5%86%85%E5%AD%98/</link><pubDate>Wed, 14 Oct 2026 08:00:22 -0400</pubDate><guid>https://note.plhwiki.cn/linux/api/%E5%86%85%E5%AD%98/</guid><description>&lt;h1 id="与内存有关的api"&gt;与内存有关的api&lt;/h1&gt;
&lt;h2 id="mmap"&gt;mmap&lt;/h2&gt;
&lt;p&gt;​ mmap将文件或设备内存映射到进程地址空间的系统调用，常用于高效 I/O（如视频采集、文件读写）或进程间共享内存。在 V4L2（Video4Linux2）驱动中，它用来将内核的摄像头缓冲区映射到用户空间，以便直接访问图像数据，避免数据拷贝。&lt;/p&gt;</description></item><item><title/><link>https://note.plhwiki.cn/linux/api/%E6%97%B6%E9%97%B4/</link><pubDate>Wed, 14 Oct 2026 08:00:22 -0400</pubDate><guid>https://note.plhwiki.cn/linux/api/%E6%97%B6%E9%97%B4/</guid><description>&lt;h1 id="获取当地时间"&gt;获取当地时间&lt;/h1&gt;
&lt;p&gt;将时间戳转换为进程当前时区的当地时间；时区通常由 TZ 或系统默认时区决定。“TZ 时间”不是独立的时间标准。&lt;/p&gt;
&lt;h2 id="localtime"&gt;localtime&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;time_t&lt;/span&gt; &lt;span class="n"&gt;now&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;tm&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;tm_now&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;localtime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;%04d-%02d-%02d %02d:%02d:%02d&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;tm_now&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;tm_year&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1900&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;tm_now&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;tm_mon&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;tm_now&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;tm_mday&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;tm_now&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;tm_hour&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;tm_now&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;tm_min&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;tm_now&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;tm_sec&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="localtime_r"&gt;localtime_r&lt;/h2&gt;
&lt;p&gt;适用于多线程，函数原型：&lt;/p&gt;</description></item><item><title/><link>https://note.plhwiki.cn/linux/boot/%E7%B3%BB%E7%BB%9F%E6%9E%84%E5%BB%BA%E4%B8%8E%E5%90%AF%E5%8A%A8/</link><pubDate>Wed, 14 Oct 2026 08:00:22 -0400</pubDate><guid>https://note.plhwiki.cn/linux/boot/%E7%B3%BB%E7%BB%9F%E6%9E%84%E5%BB%BA%E4%B8%8E%E5%90%AF%E5%8A%A8/</guid><description>&lt;h1 id="linux三板斧"&gt;Linux三板斧&lt;/h1&gt;
&lt;h2 id="u-boot"&gt;U-Boot&lt;/h2&gt;
&lt;h3 id="编译uboot"&gt;编译uboot&lt;/h3&gt;
&lt;h4 id="mc6830"&gt;&lt;strong&gt;MC6830&lt;/strong&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/home/meian/work/toolChain/molchipv500-armgcc-uclibc/bin:&lt;span class="nv"&gt;$PATH&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;make boot &lt;span class="nv"&gt;myboard&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;mc6830/demoboard
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;产物&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://note.plhwiki.cn/linux/boot/assets/image-20260819103939845.png" alt="image-20260819103939845" loading="lazy"&gt;
&lt;/p&gt;
&lt;h4 id="a1"&gt;&lt;strong&gt;A1&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;&lt;img src="https://note.plhwiki.cn/linux/boot/assets/image-20260105185419377.png" alt="image-20260105185419377" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;产物&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;**&lt;code&gt;u-boot.bin&lt;/code&gt;**只包含 U-Boot proper（第二阶段引导程序)&lt;/p&gt;
&lt;p&gt;**&lt;code&gt;u-boot-with-spl.bin&lt;/code&gt; **= SPL（第一阶段） + U-Boot proper（第二阶段） + 可能的对齐/头部/校验/填充。&lt;/p&gt;</description></item><item><title/><link>https://note.plhwiki.cn/linux/common/linux%E5%B9%B2%E8%B4%A7/</link><pubDate>Wed, 14 Oct 2026 08:00:22 -0400</pubDate><guid>https://note.plhwiki.cn/linux/common/linux%E5%B9%B2%E8%B4%A7/</guid><description>&lt;h1 id="linux-干货速查"&gt;Linux 干货速查&lt;/h1&gt;
&lt;p&gt;面向 &lt;strong&gt;Ubuntu 开发主机 + BusyBox 嵌入式开发板&lt;/strong&gt;的个人速查。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;约定&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;⚠️ 标记危险命令（误用会丢数据 / 断网 / 毁分区），执行前务必确认设备名和路径。&lt;/li&gt;
&lt;li&gt;命令行为在不同实现下可能不同，差异处标注：（GNU）Ubuntu 自带 / （BusyBox）板子 / （systemd）。&lt;/li&gt;
&lt;li&gt;拿不准的地方标注「待确认」，不猜。&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h2 id="目录"&gt;目录&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/linux/common/linux%E5%B9%B2%E8%B4%A7/#shell-%e4%b8%8e%e7%8e%af%e5%a2%83%e5%8f%98%e9%87%8f"&gt;Shell 与环境变量&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/linux/common/linux%E5%B9%B2%E8%B4%A7/#%e6%96%87%e4%bb%b6%e4%b8%8e%e7%9b%ae%e5%bd%95%e6%93%8d%e4%bd%9c"&gt;文件与目录操作&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/linux/common/linux%E5%B9%B2%E8%B4%A7/#%e6%96%87%e6%9c%ac%e6%90%9c%e7%b4%a2%e4%b8%8e%e5%a4%84%e7%90%86"&gt;文本搜索与处理&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/linux/common/linux%E5%B9%B2%E8%B4%A7/#%e7%a3%81%e7%9b%98%e5%88%86%e5%8c%ba%e4%b8%8e%e6%96%87%e4%bb%b6%e7%b3%bb%e7%bb%9f"&gt;磁盘、分区与文件系统&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/linux/common/linux%E5%B9%B2%E8%B4%A7/#%e5%86%85%e5%ad%98cpu-%e4%b8%8e-io-%e6%8e%92%e6%9f%a5"&gt;内存、CPU 与 I/O 排查&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/linux/common/linux%E5%B9%B2%E8%B4%A7/#%e7%bd%91%e7%bb%9c%e9%85%8d%e7%bd%ae%e4%b8%8e%e6%8a%93%e5%8c%85"&gt;网络配置与抓包&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/linux/common/linux%E5%B9%B2%E8%B4%A7/#%e6%96%87%e4%bb%b6%e4%bc%a0%e8%be%93%e4%b8%8e%e5%85%b1%e4%ba%ab"&gt;文件传输与共享&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/linux/common/linux%E5%B9%B2%E8%B4%A7/#systemd-%e4%b8%8e%e7%b3%bb%e7%bb%9f%e6%9c%8d%e5%8a%a1"&gt;systemd 与系统服务&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/linux/common/linux%E5%B9%B2%E8%B4%A7/#%e8%ae%be%e5%a4%87%e7%ae%a1%e7%90%86udev-%e4%b8%8e-uevent"&gt;设备管理：udev 与 uevent&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/linux/common/linux%E5%B9%B2%E8%B4%A7/#%e4%ba%a4%e5%8f%89%e7%bc%96%e8%af%91%e5%b7%a5%e5%85%b7%e9%93%be"&gt;交叉编译工具链&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/linux/common/linux%E5%B9%B2%E8%B4%A7/#%e5%b8%b8%e8%a7%81%e6%95%85%e9%9a%9c%e4%b8%8e%e6%8e%92%e6%9f%a5%e6%a1%88%e4%be%8b"&gt;常见故障与排查案例&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="shell-与环境变量"&gt;Shell 与环境变量&lt;/h2&gt;
&lt;h3 id="重定向"&gt;重定向&lt;/h3&gt;
&lt;p&gt;从文件读入 stdin：&lt;/p&gt;</description></item><item><title/><link>https://note.plhwiki.cn/linux/common/linux%E7%B3%BB%E7%BB%9F%E7%BC%96%E7%A8%8B/</link><pubDate>Wed, 14 Oct 2026 08:00:22 -0400</pubDate><guid>https://note.plhwiki.cn/linux/common/linux%E7%B3%BB%E7%BB%9F%E7%BC%96%E7%A8%8B/</guid><description>&lt;h1 id="文件系统"&gt;文件系统&lt;/h1&gt;
&lt;p&gt;文件索引节点：inode&lt;/p&gt;
&lt;p&gt;两部分
纯数据区&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;文件真正的数据存储区、基本存储单位为block&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;元数据区&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;文件属性：磁盘中的存储位置、文件长度等信息&lt;/li&gt;
&lt;li&gt;时间戳：atime（访问）、mtime（内容修改）、ctime（inode 状态变更）；ctime 不是创建时间，创建时间 btime 是否可用取决于文件系统和接口&lt;/li&gt;
&lt;li&gt;读写权限：通常在 open 等获取访问权限时检查文件权限；后续 read/write 还受文件描述符访问模式等约束&lt;/li&gt;
&lt;li&gt;所属组、所有者&lt;/li&gt;
&lt;li&gt;链接数&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="挂载"&gt;挂载&lt;/h2&gt;
&lt;p&gt;​ &lt;strong&gt;挂载&lt;/strong&gt;是一个非常重要的功能，使用非常频繁。它指将一个设备(通常是存储设备，可以挂载光盘、硬盘、磁带、光盘镜像文件等)&lt;strong&gt;挂接到一个已存在的目录上，那么，你访问这个目录就是访问这个设备&lt;/strong&gt;（这个目录可以不为空，但挂载后这个目录下以前的内容将不可用）
，&lt;font color = red&gt;一个目录一旦成为&amp;quot;挂载点&amp;quot;，该目录下看到的内容，来自&amp;quot;被挂载的文件系统&amp;quot;， 与父目录的存储介质完全无关。&lt;/font&gt;&lt;/p&gt;</description></item><item><title/><link>https://note.plhwiki.cn/linux/kernel/%E5%86%85%E5%AD%98/</link><pubDate>Wed, 14 Oct 2026 08:00:22 -0400</pubDate><guid>https://note.plhwiki.cn/linux/kernel/%E5%86%85%E5%AD%98/</guid><description>&lt;h1 id="page--cache"&gt;Page Cache&lt;/h1&gt;
&lt;p&gt;​ Page Cache 就是内核为了加速文件读写而在内存中保留的文件页。普通文件的缓冲 I/O 通常经过 Page Cache；缓存未命中时仍可能发起存储 I/O。O_DIRECT 等路径可绕过 Page Cache，因此不能把所有 read/write 都视为缓存访问。&lt;/p&gt;</description></item><item><title/><link>https://note.plhwiki.cn/linux/kernel/%E6%A8%A1%E5%9D%97%E6%9C%BA%E5%88%B6/</link><pubDate>Wed, 14 Oct 2026 08:00:22 -0400</pubDate><guid>https://note.plhwiki.cn/linux/kernel/%E6%A8%A1%E5%9D%97%E6%9C%BA%E5%88%B6/</guid><description>&lt;h1 id="模块机制"&gt;模块机制&lt;/h1&gt;
&lt;h2 id="可加载模块的概念"&gt;可加载模块的概念&lt;/h2&gt;
&lt;p&gt;​&lt;/p&gt;
&lt;p&gt;Linux 是支持可加载模块的宏内核。模块可以在运行时加载或卸载，加载后仍在内核空间执行。&lt;/p&gt;
&lt;p&gt;微内核把部分服务移到用户空间，与“宏内核支持模块”是两回事。跨进程通信可能引入开销，但不能据此笼统断言微内核一定低性能。&lt;/p&gt;</description></item><item><title/><link>https://note.plhwiki.cn/linux/kernel/%E8%BF%9B%E7%A8%8B%E8%B0%83%E5%BA%A6/</link><pubDate>Wed, 14 Oct 2026 08:00:22 -0400</pubDate><guid>https://note.plhwiki.cn/linux/kernel/%E8%BF%9B%E7%A8%8B%E8%B0%83%E5%BA%A6/</guid><description>&lt;h1 id="进程调度"&gt;进程调度&lt;/h1&gt;
&lt;h2 id="进程"&gt;进程&lt;/h2&gt;
&lt;p&gt;进程是程序在一个数据集合上的&lt;strong&gt;一次动态执行过程&lt;/strong&gt;。它不仅包含代码，还包含当前的活动状态、内存、系统资源等。进程可以被分为 I/O 密集型（I/O-bound）和 CPU 密集型（CPU-bound）&lt;/p&gt;</description></item><item><title/><link>https://note.plhwiki.cn/linux/net/linux%E7%BD%91%E7%BB%9C/</link><pubDate>Wed, 14 Oct 2026 08:00:22 -0400</pubDate><guid>https://note.plhwiki.cn/linux/net/linux%E7%BD%91%E7%BB%9C/</guid><description>&lt;h1 id="tcp建立连接的过程"&gt;TCP建立连接的过程&lt;/h1&gt;
&lt;h2 id="listen"&gt;listen&lt;/h2&gt;
&lt;p&gt;listen 将 socket 标记为被动监听状态。理解正常握手时，可以区分未完成握手的请求和已完成握手、等待 accept 的连接；开启 SYN cookies 等机制时，不一定为每个 SYN 保存半连接记录。&lt;/p&gt;</description></item><item><title/><link>https://note.plhwiki.cn/multimedia/v4l2/v4l2%E6%A0%B8%E5%BF%83%E7%BB%93%E6%9E%84%E4%BD%93/</link><pubDate>Wed, 14 Oct 2026 08:00:22 -0400</pubDate><guid>https://note.plhwiki.cn/multimedia/v4l2/v4l2%E6%A0%B8%E5%BF%83%E7%BB%93%E6%9E%84%E4%BD%93/</guid><description>&lt;h1 id="核心结构体"&gt;核心结构体&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;核心组件作用&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;组件&lt;/th&gt;
&lt;th&gt;功能&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;video_device&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;设备节点注册（创建 &lt;code&gt;/dev/videoX&lt;/code&gt;）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;v4l2_device&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;设备逻辑管理（电源 / 子设备协调）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;vb2_queue&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;缓冲区队列管理（核心创新点）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;v4l2_subdev&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;子设备抽象（传感器 / ISP 等）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="struct-v4l2_buffer"&gt;struct v4l2_buffer&lt;/h2&gt;
&lt;p&gt;用来描述&amp;quot;一块视频缓冲区&amp;quot;的所有元信息。它的常用字段大致有：&lt;/p&gt;</description></item><item><title/><link>https://note.plhwiki.cn/reference/%E5%AD%A6%E4%B9%A0%E8%B5%84%E6%BA%90/</link><pubDate>Wed, 14 Oct 2026 08:00:22 -0400</pubDate><guid>https://note.plhwiki.cn/reference/%E5%AD%A6%E4%B9%A0%E8%B5%84%E6%BA%90/</guid><description>&lt;h1 id="学习资料"&gt;学习资料&lt;/h1&gt;
&lt;p&gt;win11搭建网络映射器：https://m.comcw.cn/jc/4614.html&lt;/p&gt;
&lt;p&gt;音视频学习：https://github.com/0voice/audio_video_streaming&lt;/p&gt;</description></item><item><title/><link>https://note.plhwiki.cn/multimedia/gstream/gstreamer/</link><pubDate>Sun, 04 Oct 2026 22:46:21 +0800</pubDate><guid>https://note.plhwiki.cn/multimedia/gstream/gstreamer/</guid><description>&lt;h1 id="命令测试"&gt;命令测试&lt;/h1&gt;
&lt;h2 id="播放视频"&gt;播放视频&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gst-play-1.0 --flags&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --videosink&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;fpsdisplaysink video-sink=xvimagesink signal-fps-measurements=true text-overlay=false sync=false&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --audiosink&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;alsasink device=hw:1,0&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; /root/nfs/test2.mp4
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="参数"&gt;&lt;strong&gt;参数&lt;/strong&gt;&lt;/h2&gt;
&lt;h3 id="flag"&gt;flag&lt;/h3&gt;
&lt;p&gt;这个参数控制 &lt;code&gt;playbin&lt;/code&gt; 开启哪些功能，本质上是一个 &lt;strong&gt;bit mask（位掩码）&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;bit 0 = 1 VIDEO
bit 1 = 2 AUDIO
bit 2 = 4 TEXT / subtitle
&lt;/code&gt;&lt;/pre&gt;&lt;blockquote&gt;
&lt;p&gt;flag=3 意味着开启视频和音频，但不启用字幕 TEXT。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title/><link>https://note.plhwiki.cn/hardware/ddr/</link><pubDate>Wed, 30 Sep 2026 17:52:47 +0800</pubDate><guid>https://note.plhwiki.cn/hardware/ddr/</guid><description/></item><item><title/><link>https://note.plhwiki.cn/hardware/mipi/</link><pubDate>Wed, 30 Sep 2026 17:52:47 +0800</pubDate><guid>https://note.plhwiki.cn/hardware/mipi/</guid><description>&lt;h1 id="mipi接口"&gt;MIPI接口&lt;/h1&gt;
&lt;p&gt;MIPI有多个&lt;/p&gt;</description></item><item><title/><link>https://note.plhwiki.cn/linux/common/shell/</link><pubDate>Wed, 30 Sep 2026 17:52:47 +0800</pubDate><guid>https://note.plhwiki.cn/linux/common/shell/</guid><description>&lt;h1 id="shell语法"&gt;Shell语法&lt;/h1&gt;
&lt;h2 id="case"&gt;case&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;$&lt;span class="s2"&gt;变量&amp;#34;&lt;/span&gt; in
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 模式1&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 命令
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 模式2&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 命令
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;esac&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;)&lt;/code&gt;：表示这个匹配模式写完了，后面开始执行这个分支的命令。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;;;&lt;/code&gt;：表示这个分支结束，类似 C/C++ &lt;code&gt;switch&lt;/code&gt; 里的 &lt;code&gt;break&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;|&lt;/code&gt;：表示“或者”，例如 &lt;code&gt;bound|renew)&lt;/code&gt; 表示匹配 &lt;code&gt;bound&lt;/code&gt; 或 &lt;code&gt;renew&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;in&lt;/code&gt;：开始列出匹配规则。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;esac&lt;/code&gt;：结束 &lt;code&gt;case&lt;/code&gt;，就是 &lt;code&gt;case&lt;/code&gt; 倒过来写。&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title/><link>https://note.plhwiki.cn/linux/drive/4g/</link><pubDate>Wed, 30 Sep 2026 17:52:47 +0800</pubDate><guid>https://note.plhwiki.cn/linux/drive/4g/</guid><description>&lt;h1 id="驱动移植"&gt;驱动移植&lt;/h1&gt;
&lt;p&gt;​ 4G模块加载 &lt;strong&gt;USB 转串口驱动option&lt;/strong&gt;后会在/dev/下创建ttyUSB0、ttyUSB1 和 ttyUSB2 等设备文件。如果没有出现，需要在drivers/usb/serial/option.c里添加VID（Vendor ID）与PID（Product ID）&lt;/p&gt;</description></item><item><title/><link>https://note.plhwiki.cn/linux/drive/scsi/</link><pubDate>Wed, 30 Sep 2026 17:52:47 +0800</pubDate><guid>https://note.plhwiki.cn/linux/drive/scsi/</guid><description/></item><item><title/><link>https://note.plhwiki.cn/multimedia/ffmpeg/ffmpeg/</link><pubDate>Wed, 30 Sep 2026 17:52:47 +0800</pubDate><guid>https://note.plhwiki.cn/multimedia/ffmpeg/ffmpeg/</guid><description>&lt;h1 id="ffmpeg-60编译"&gt;ffmpeg-6.0编译&lt;/h1&gt;
&lt;p&gt;把x264/x265 全部去掉，同时保留 MP4 写文件和音频转 AAC 所需的组件&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ./configure --prefix&lt;span class="o"&gt;=&lt;/span&gt;/home/meian/work/MyProject/ffmpeg/ffmpeg-6.0/out_Jz --arch&lt;span class="o"&gt;=&lt;/span&gt;mips --target-os&lt;span class="o"&gt;=&lt;/span&gt;linux --enable-cross-compile --cross-prefix&lt;span class="o"&gt;=&lt;/span&gt;mips-v720s229-linux-uclibc-gnu- --disable-asm --enable-pic --disable-debug --disable-programs --disable-ffmpeg --disable-ffprobe --disable-ffplay --disable-doc --disable-htmlpages --disable-manpages --disable-podpages --disable-txtpages --disable-symver --disable-iconv --disable-avfilter --disable-avdevice --disable-postproc --disable-indevs --disable-outdevs --disable-v4l2-m2m --disable-encoders --disable-decoders --disable-demuxers --disable-muxers --disable-parsers --disable-protocols --enable-decoder&lt;span class="o"&gt;=&lt;/span&gt;pcm_alaw --enable-decoder&lt;span class="o"&gt;=&lt;/span&gt;pcm_mulaw --enable-encoder&lt;span class="o"&gt;=&lt;/span&gt;aac --enable-parser&lt;span class="o"&gt;=&lt;/span&gt;h264 --enable-parser&lt;span class="o"&gt;=&lt;/span&gt;hevc --enable-muxer&lt;span class="o"&gt;=&lt;/span&gt;mp4 --enable-protocol&lt;span class="o"&gt;=&lt;/span&gt;file --extra-libs&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;-lpthread -lm&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;正常的编译&lt;/p&gt;</description></item><item><title/><link>https://note.plhwiki.cn/database/database/</link><pubDate>Wed, 12 Aug 2026 19:52:47 +0800</pubDate><guid>https://note.plhwiki.cn/database/database/</guid><description/></item><item><title/><link>https://note.plhwiki.cn/hardware/%E6%A8%A1%E7%94%B5/</link><pubDate>Sun, 26 Jul 2026 03:37:06 -0400</pubDate><guid>https://note.plhwiki.cn/hardware/%E6%A8%A1%E7%94%B5/</guid><description/></item><item><title>目录</title><link>https://note.plhwiki.cn/catalog/</link><pubDate>Wed, 08 Jul 2026 23:30:57 +0800</pubDate><guid>https://note.plhwiki.cn/catalog/</guid><description>按目录结构浏览全部笔记</description></item><item><title/><link>https://note.plhwiki.cn/linux/drive/char_driver/</link><pubDate>Wed, 27 May 2026 00:10:57 +0800</pubDate><guid>https://note.plhwiki.cn/linux/drive/char_driver/</guid><description/></item><item><title/><link>https://note.plhwiki.cn/cpp/3rdpart/zlmediakit/</link><pubDate>Mon, 27 Apr 2026 20:00:42 +0800</pubDate><guid>https://note.plhwiki.cn/cpp/3rdpart/zlmediakit/</guid><description/></item><item><title/><link>https://note.plhwiki.cn/cpp/3rdpart/openssl/</link><pubDate>Wed, 22 Apr 2026 18:03:59 +0800</pubDate><guid>https://note.plhwiki.cn/cpp/3rdpart/openssl/</guid><description/></item></channel></rss>