<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Linux on Lishengxie</title>
		<link>https://lishengxie.github.io/categories/linux/</link>
		<description>Recent content in Linux on Lishengxie</description>
		<generator>Hugo</generator>
		<language>en-us</language>
		
		
		
		
			<lastBuildDate>Sun, 14 Sep 2025 21:58:04 +0800</lastBuildDate>
		
			<atom:link href="https://lishengxie.github.io/categories/linux/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>Let&#39;s Encrypt 免费申请 SSL 证书，并实现自动续期</title>
				<link>https://lishengxie.github.io/post/lets-encrypt-ssl/</link>
				<pubDate>Sun, 14 Sep 2025 21:58:04 +0800</pubDate>
				<guid>https://lishengxie.github.io/post/lets-encrypt-ssl/</guid>
				<description>&lt;h2 id=&#34;背景&#34;&gt;背景&lt;/h2&gt;&#xA;&lt;p&gt;对于公网可以访问的网站，使用 HTTPS 协议是保证安全访问的基础要求，而 SSL 证书又是 HTTPS 协议不可或缺的一环。SSL 证书需要 CA 机构颁发，当前使用了阿里云的个人测试证书（免费证书），申请后上传到服务器并更新 nginx 配置。&lt;/p&gt;&#xA;&lt;p&gt;当前存在的问题是，阿里云的免费 SSL 证书每三个月过期一次，需要手动重新申请并部署到服务器上，流程比较复杂。在网上看到可以使用 Let&amp;rsquo;s Encrypt 免费申请 SSL 证书，并实现自动续期，于是做了尝试，这里记录下相关流程。&lt;/p&gt;&#xA;&lt;h2 id=&#34;环境准备&#34;&gt;环境准备&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;一台可以访问公网的服务器，我使用的是 Linux/Ubuntu。&lt;/li&gt;&#xA;&lt;li&gt;root 权限或者 sudo 权限。&lt;/li&gt;&#xA;&lt;li&gt;存在 DNS 解析的域名。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;lets-encrypt-证书颁发&#34;&gt;Let&amp;rsquo;s Encrypt 证书颁发&lt;/h2&gt;&#xA;&lt;p&gt;Let’s Encrypt 是一个免费的、自动化的、开放的证书颁发机构（CA），提供免费 SSL 证书。它的目标是让所有网站都能轻松实现 HTTPS 加密，保障用户数据的安全。通过 Let’s Encrypt 可以为网站的主域名、子域名，甚至泛域名配置安全证书，而且过程完全自动化，不需要手动申请和管理证书，官方推荐使用 &lt;a href=&#34;https://certbot.eff.org/&#34;&gt;Certbot&lt;/a&gt;。&lt;/p&gt;&#xA;&lt;h3 id=&#34;certbot-安装&#34;&gt;Certbot 安装&lt;/h3&gt;&#xA;&lt;p&gt;Linux 平台上可以使用 snap 或 pip 安装 Certbot，这里使用 Python + pip 的方式，参考&lt;a href=&#34;https://certbot.eff.org/instructions?ws=nginx&amp;amp;os=pip&#34;&gt;安装流程&lt;/a&gt;。&lt;/p&gt;&#xA;&lt;p&gt;1、首先安装 Python 环境。&lt;/p&gt;</description>
			</item>
			<item>
				<title>Nginx禁止使用IP直接访问服务器上相应端口</title>
				<link>https://lishengxie.github.io/post/nginx-prohibit-ip-request/</link>
				<pubDate>Sat, 11 May 2024 21:48:52 +0800</pubDate>
				<guid>https://lishengxie.github.io/post/nginx-prohibit-ip-request/</guid>
				<description>&lt;h2 id=&#34;起因&#34;&gt;起因&lt;/h2&gt;&#xA;&lt;p&gt;我的服务器中部署了一个typecho博客和两个使用docker容器的服务，其中docker容器使用端口映射，将容器中的端口映射到宿主机上的端口实现访问。&lt;/p&gt;&#xA;&lt;p&gt;一次偶然机会发现服务器上的服务可以通过IP+端口的方式直接访问，如果有未备案的域名解析到我们服务器的IP，可能会导致云服务器厂商关停我们的服务造成一些问题。因此，我们需要禁止通过IP+端口直接访问服务。&lt;/p&gt;&#xA;&lt;h2 id=&#34;nginx-配置&#34;&gt;Nginx 配置&lt;/h2&gt;&#xA;&lt;p&gt;这里的三个服务通过nginx进行转发，对不同&lt;code&gt;server_name&lt;/code&gt;的请求会直接转发到对应的服务进程。因此，这里有限考虑使用nginx配置来禁止IP+端口的访问。服务器上主要开放了两个端口，80和443，分别用于HTTP和HTTPS请求，在实际进行相应配置时二者也有所不同。&lt;/p&gt;&#xA;&lt;h3 id=&#34;80-端口&#34;&gt;80 端口&lt;/h3&gt;&#xA;&lt;p&gt;对于80端口，我们在&lt;code&gt;nginx.conf&lt;/code&gt;中添加如下配置。具体原理在于，当根据listen无法得到最佳匹配时，nginx会使用请求中的Host值匹配server_name，匹配顺序可以参考这篇&lt;a href=&#34;https://zhuanlan.zhihu.com/p/109509478&#34;&gt;博客&lt;/a&gt;。IP+端口进行请求时匹配到下面的server配置，直接返回403错误信息。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;server&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;listen&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;80&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;default_server;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;server_name&lt;/span&gt;  &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;_;&lt;/span&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;403;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;443端口&#34;&gt;443端口&lt;/h3&gt;&#xA;&lt;p&gt;由于使用了HTTPS协议，因此还需要禁止通过IP+443端口的访问方式。具体参考了下面的博客：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.huixiangdou.cn/archives/nginx-jin-zhi-80-443-duan-kou&#34;&gt;https://www.huixiangdou.cn/archives/nginx-jin-zhi-80-443-duan-kou&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;具体来说，Nginx 上对于 SSL 服务器在不配置证书的时候会出现协议错误，哪怕端口上配置了其他网站也会报错。因此，我们需要随便生成一个证书进行配置，生成 SSL 证书可以使用这个网站&lt;a href=&#34;https://myssl.com/create_test_cert.html&#34;&gt;https://myssl.com/create_test_cert.html&lt;/a&gt;。在&lt;code&gt;nginx.conf&lt;/code&gt;中添加如下配置：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;server&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;listen&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;80&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;default;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;listen&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;443&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;default_server;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;#SSL-START&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;SSL相关配置，请勿删除或修改下一行带注释的404规则&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;#error_page&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;404/404.html;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;ssl_certificate&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/path/to/cert.pem;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;ssl_certificate_key&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/path/to/private.key;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;ssl_protocols&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;TLSv1&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;TLSv1.1&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;TLSv1.2;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;ssl_ciphers&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4:!DH:!DHE;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;ssl_prefer_server_ciphers&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;on;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;ssl_session_cache&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;shared:SSL:10m;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;ssl_session_timeout&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;10m;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;error_page&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;497&lt;/span&gt;  &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;https:&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//$host$request_uri;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;#SSL-END&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;server_name&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;_;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;403;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;配置完成后重载 Nginx 配置。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ nginx -t&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ nginx -s reload&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;docker容器问题&#34;&gt;Docker容器问题&lt;/h2&gt;&#xA;&lt;p&gt;Docker容器通过端口映射实现服务的对外可用性，这里是通过&lt;code&gt;-p host_port:container_port&lt;/code&gt;实现容器上的端口到宿主机上端口的映射。具体来说，以容器的80端口映射到宿主机的8080端口为例，docker容器运行时使用了&lt;code&gt;-p 8080:80&lt;/code&gt;，Nginx中监听了80端口，并在对应域名访问时将请求转发到服务器的8080端口。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-nginx&#34; data-lang=&#34;nginx&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;location&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;/&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;proxy_pass&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;http://host_ip:8080&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;但是，在根据上面的配置禁止了直接使用IP+80/443端口访问的方式后，发现&lt;code&gt;host_ip:8080&lt;/code&gt;仍然能够访问到docker容器中的服务。查询相关资料修改了iptables路由表和sfw防火墙规则后，仍然无法解决问题。防火墙上没有打开端口，但仍然可以访问。最后通过查找资料发现是docker自身的原因，下面是docker官方的介绍：&lt;/p&gt;</description>
			</item>
			<item>
				<title>云服务器软件安装</title>
				<link>https://lishengxie.github.io/post/cloud-server-software-install/</link>
				<pubDate>Sun, 30 Apr 2023 08:51:16 +0800</pubDate>
				<guid>https://lishengxie.github.io/post/cloud-server-software-install/</guid>
				<description>&lt;p&gt;&lt;strong&gt;Docker安装(Ubuntu 20.04)&lt;/strong&gt;：参考&lt;a href=&#34;https://zhuanlan.zhihu.com/p/143156163&#34;&gt;知乎博客&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;更新软件包索引，并且安装必要的依赖软件&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo apt update&#xA;sudo apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;2&#34;&gt;&#xA;&lt;li&gt;使用下面的 curl 导入源仓库的 GPG key：&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;3&#34;&gt;&#xA;&lt;li&gt;将 Docker APT 软件源添加到你的系统：&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo add-apt-repository &amp;#34;deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable&amp;#34;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;4&#34;&gt;&#xA;&lt;li&gt;安装Docker&#xA;a. 安装最新版本的Docker&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo apt update&#xA;sudo apt install docker-ce docker-ce-cli containerd.io&#xA;&lt;/code&gt;&lt;/pre&gt;b. 安装指定版本的docker&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# 列出所有可用的docker版本&#xA;sudo apt update&#xA;apt list -a docker-ce&#xA;# 安装docker&#xA;sudo apt install docker-ce=&amp;lt;VERSION&amp;gt; docker-ce-cli=&amp;lt;VERSION&amp;gt; containerd.io&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&#xA;&lt;li&gt;验证安装成功&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo systemctl status docker&#xA;docker container run hello-world&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Golang安装&lt;/strong&gt;：参考&lt;a href=&#34;https://cloud.tencent.com/developer/article/1623121&#34;&gt;腾讯云博客&lt;/a&gt;&lt;/p&gt;</description>
			</item>
			<item>
				<title>常用资源汇总</title>
				<link>https://lishengxie.github.io/post/common-resources/</link>
				<pubDate>Sun, 30 Apr 2023 08:49:48 +0800</pubDate>
				<guid>https://lishengxie.github.io/post/common-resources/</guid>
				<description>&lt;h3 id=&#34;python&#34;&gt;python&lt;/h3&gt;&#xA;&lt;h4 id=&#34;pip国内镜像&#34;&gt;pip国内镜像&lt;/h4&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 清华镜像源&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;https://pypi.tuna.tsinghua.edu.cn/simple&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 豆瓣镜像源&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;http://pypi.douban.com/simple/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 阿里云镜像源&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;http://mirrors.aliyun.com/pypi/simple/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 中国科学技术大学镜像源&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;http://pypi.mirrors.ustc.edu.cn/simple/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;使用方法为&lt;code&gt;pip install package_name -i 镜像源&lt;/code&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;ubuntu更换镜像源&#34;&gt;Ubuntu更换镜像源&lt;/h3&gt;&#xA;&lt;p&gt;如果Ubuntu原始速度还可以的话建议不要换源，常用的有阿里云镜像、清华镜像和搜狐镜像，这里是我使用的镜像，北京外国语大学镜像。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;deb https://mirrors.bfsu.edu.cn/ubuntu/ focal main restricted universe multiverse&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# deb-src https://mirrors.bfsu.edu.cn/ubuntu/ focal main restricted universe multiverse&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;deb https://mirrors.bfsu.edu.cn/ubuntu/ focal-updates main restricted universe multiverse&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# deb-src https://mirrors.bfsu.edu.cn/ubuntu/ focal-updates main restricted universe multiverse&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;deb https://mirrors.bfsu.edu.cn/ubuntu/ focal-backports main restricted universe multiverse&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# deb-src https://mirrors.bfsu.edu.cn/ubuntu/ focal-backports main restricted universe multiverse&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;deb https://mirrors.bfsu.edu.cn/ubuntu/ focal-security main restricted universe multiverse&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# deb-src https://mirrors.bfsu.edu.cn/ubuntu/ focal-security main restricted universe multiverse&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 预发布软件源，不建议启用&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# deb https://mirrors.bfsu.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# deb-src https://mirrors.bfsu.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ubuntu换源的具体操作为&lt;/p&gt;</description>
			</item>
			<item>
				<title>Linux常用命令记录</title>
				<link>https://lishengxie.github.io/post/linux-command/</link>
				<pubDate>Sun, 30 Apr 2023 08:47:32 +0800</pubDate>
				<guid>https://lishengxie.github.io/post/linux-command/</guid>
				<description>&lt;h3 id=&#34;vim&#34;&gt;Vim&lt;/h3&gt;&#xA;&lt;p&gt;&lt;strong&gt;vim删除文件中的所有内容&lt;/strong&gt;： ESC确保退出编辑模式，按下&amp;quot;:&amp;ldquo;切换到命令模式然后输入%d并执行&#xA;&lt;strong&gt;vim删除单行内容&lt;/strong&gt;：将光标移动到需要删除的行，ESC确保退出编辑模式，按两次d键。&#xA;&lt;strong&gt;vim删除多行内容&lt;/strong&gt;：将光标移动到需要删除的第一行，ESC确保退出编辑模式。在dd命令前面加上要删除的行数。例如，如果要删除第4行以下的3行，请先移动至第四行，再按下3dd。&#xA;&lt;strong&gt;vim撤销&amp;amp;恢复&lt;/strong&gt;：u是撤销刚才做的动作，ctrl+r 是恢复刚才撤销的动作。&lt;/p&gt;&#xA;&lt;h3 id=&#34;文件操作&#34;&gt;文件操作&lt;/h3&gt;&#xA;&lt;p&gt;参考博客&lt;a href=&#34;https://www.cnblogs.com/liaojie970/p/6746230.html&#34;&gt;https://www.cnblogs.com/liaojie970/p/6746230.html&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h4 id=&#34;文件复制&#34;&gt;文件复制&lt;/h4&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;命令格式：cp &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;-adfilprsu&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; 源文件&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;source&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; 目标文件&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;destination&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cp &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;option&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; source1 source2 source3 ... directory&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;参数说明：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;-a:是指archive的意思，也说是指复制所有的目录&#xA;-d:若源文件为连接文件(link file)，则复制连接文件属性而非文件本身&#xA;-f:强制(force)，若有重复或其它疑问时，不会询问用户，而强制复制&#xA;-i:若目标文件(destination)已存在，在覆盖时会先询问是否真的操作&#xA;-l:建立硬连接(hard link)的连接文件，而非复制文件本身&#xA;-p:与文件的属性一起复制，而非使用默认属性&#xA;-r:递归复制，用于目录的复制操作&#xA;-s:复制成符号连接文件(symbolic link)，即“快捷方式”文件&#xA;-u:若目标文件比源文件旧，更新目标文件 &#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;如将/test1目录下的file1复制到/test3目录，并将文件名改为file2,可输入以下命令：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cp /test1/file1 /test3/file2&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;文件移动&#34;&gt;文件移动&lt;/h4&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;命令格式：mv &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;-fiv&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; source destination&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;参数说明:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;-f:force，强制直接移动而不询问&#xA;-i:若目标文件(destination)已经存在，就会询问是否覆盖&#xA;-u:若目标文件已经存在，且源文件比较新，才会更新&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;如将/test1目录下的file1移动到/test3 目录，并将文件名改为file2,可输入以下命令：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mv /test1/file1 /test3/file2&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;文件删除&#34;&gt;文件删除&lt;/h4&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;命令格式：rm &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;fir&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; 文件或目录&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;参数说明：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;-f:强制删除&#xA;-i:交互模式，在删除前询问用户是否操作&#xA;-r:递归删除，常用在目录的删除&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;如删除/test目录下的file1文件，可以输入以下命令：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;rm -i /test/file1&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;windows-常用命令&#34;&gt;Windows 常用命令&lt;/h3&gt;&#xA;&lt;p&gt;&lt;strong&gt;PowerShell创建新文件夹和新文件&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;mkdir 文件夹名称&#xA;new-item 文件名称.文件格式 -type file&#xA;&lt;/code&gt;&lt;/pre&gt;</description>
			</item>
			<item>
				<title>Gdb调试学习</title>
				<link>https://lishengxie.github.io/post/gdb-study/</link>
				<pubDate>Sun, 30 Apr 2023 08:40:25 +0800</pubDate>
				<guid>https://lishengxie.github.io/post/gdb-study/</guid>
				<description>&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;&#xA;&lt;p&gt;使用linux进行systemc的开发时经常出现core dump的文件，对于较大的项目vscode无法很快地进行debug，clion对makefile的支持不是很好，此时想到使用gdb进行调试并学习了一些基本的操作。以下的内容主要参考这篇博客和gdb debug的参考文档。&lt;/p&gt;&#xA;&lt;p&gt;参考资料：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.yanbinghu.com/2019/04/20/41283.html&#34;&gt;https://www.yanbinghu.com/2019/04/20/41283.html&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.eecs.umich.edu/courses/eecs373/readings/Debugger.pdf&#34;&gt;Debugging with GDB&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;启动调试&#34;&gt;启动调试&lt;/h2&gt;&#xA;&lt;p&gt;GDB需要一个带有调试信息的可执行文件进行调试，因此编译过程中出现的错误无法使用GDB进行排除。通常对于C或者C++程序来说，在编译时加上&lt;code&gt;-g&lt;/code&gt;参数可以保留调试信息，否则不能使用GDB进行调试。使用cmake时，可以在&lt;code&gt;CMakeLists.txt&lt;/code&gt;文件中添加以下指令以支持GDB调试。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-cmake&#34; data-lang=&#34;cmake&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;SET(&lt;span style=&#34;color:#e6db74&#34;&gt;CMAKE_BUILD_TYPE&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Debug&amp;#34;&lt;/span&gt;)&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;SET(&lt;span style=&#34;color:#e6db74&#34;&gt;CMAKE_CXX_FLAGS_DEBUG&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;$ENV{CXXFLAGS} -O0 -Wall -g2 -ggdb&amp;#34;&lt;/span&gt;)&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;SET(&lt;span style=&#34;color:#e6db74&#34;&gt;CMAKE_CXX_FLAGS_RELEASE&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;$ENV{CXXFLAGS} -O3 -Wall&amp;#34;&lt;/span&gt;)&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果程序不是自己编译的，那么如何判断文件中是否带有调试信息呢，这篇&lt;a href=&#34;https://www.yanbinghu.com/2019/04/20/41283.html&#34;&gt;博客&lt;/a&gt;中给出了几种调试的方法。&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;使用gdb&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ gdb main&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Reading symbols from main...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果提示no debugging symbols found, 那么不可以使用gdb调试该可执行文件。&#xA;2. readelf&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# main是可执行文件名称&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ readelf -S main | grep debug&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start=&#34;3&#34;&gt;&#xA;&lt;li&gt;file查看strip状况&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ file main&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果输出内容为xxx stripped, 那么说明该文件的调试信息已经被去除，不能使用gdb调试。但是not stripped的情况不能说明该文件可以被调试。&lt;/p&gt;&#xA;&lt;h2 id=&#34;启动调试-1&#34;&gt;启动调试&lt;/h2&gt;&#xA;&lt;h3 id=&#34;无参数程序&#34;&gt;无参数程序&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ gdb main&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;gdb&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; run&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;输入run命令即可运行程序。&lt;/p&gt;</description>
			</item>
			<item>
				<title>Makefile使用学习</title>
				<link>https://lishengxie.github.io/post/makefile-study/</link>
				<pubDate>Sun, 30 Apr 2023 08:37:37 +0800</pubDate>
				<guid>https://lishengxie.github.io/post/makefile-study/</guid>
				<description>&lt;h2 id=&#34;参考教程&#34;&gt;参考教程&lt;/h2&gt;&#xA;&lt;p&gt;原文：&lt;a href=&#34;https://makefiletutorial.com/&#34;&gt;https://makefiletutorial.com/&lt;/a&gt;&#xA;中文翻译：&lt;a href=&#34;https://makefiletutorial.vercel.app&#34;&gt;https://makefiletutorial.vercel.app&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;makefile常用内容&#34;&gt;Makefile常用内容&lt;/h2&gt;&#xA;&lt;p&gt;本文主要基于以上教程记录一些平时阅读&lt;code&gt;Makefile&lt;/code&gt;可能会用到的信息。&lt;/p&gt;&#xA;&lt;h3 id=&#34;makefile基础使用&#34;&gt;Makefile基础使用&lt;/h3&gt;&#xA;&lt;p&gt;首先，Makefile用于帮助决定一个大型程序的哪些部分需要重新编译，如果有任何文件的依赖项发生改变，那么该文件将会重新编译。Makefile通常由一组规则组成，规则通常如下所示：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-makefile&#34; data-lang=&#34;makefile&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;target&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; prerequisites&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;command&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;command&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;command&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;target&lt;/code&gt;是文件名，以空格分隔，通常每个规则只有一个。&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;command&lt;/code&gt;通常是用于制作目标的一系列步骤，需要以制表符&lt;code&gt;Tab&lt;/code&gt;而不是空格开头。&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;prerequisites&lt;/code&gt;也是文件名，称为依赖项，以空格分隔，在运行针对目标的命令之前，这些文件需要存在。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;下面是一个&lt;code&gt;Makefile&lt;/code&gt;的实例：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-makefile&#34; data-lang=&#34;makefile&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;blah&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; blah.o&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;gcc blah.o -o blah &lt;span style=&#34;color:#75715e&#34;&gt;# Runs third&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;blah.o&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; blah.c&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;gcc -c blah.c -o blah.o &lt;span style=&#34;color:#75715e&#34;&gt;# Runs second&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Typically blah.c would already exist, but I want to limit any additional required files&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;blah.c&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;int main() { return 0; }&amp;#34;&lt;/span&gt; &amp;gt; blah.c &lt;span style=&#34;color:#75715e&#34;&gt;# Runs first&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;使用&lt;code&gt;make&lt;/code&gt;时默认会执行第一个目标&lt;code&gt;blah&lt;/code&gt;，或者可以指定目标进行生成&lt;code&gt;make blah&lt;/code&gt;。上面的Makefile在执行&lt;code&gt;make&lt;/code&gt;指令后按照一系列步骤进行调用：&lt;/p&gt;</description>
			</item>
	</channel>
</rss>
