<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>源码编译 &#8211; bhzhuOS爱好者(原StartOS爱好者)</title>
	<atom:link href="https://www.bhzhu203.com/category/linux%E7%9F%A5%E8%AF%86/%E6%BA%90%E7%A0%81%E7%BC%96%E8%AF%91/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.bhzhu203.com</link>
	<description>QQ群号125732839</description>
	<lastBuildDate>Tue, 17 Jun 2025 09:28:08 +0000</lastBuildDate>
	<language>zh-Hans</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.5.7</generator>
	<item>
		<title>静态编译Python3程序模块指南- How to make Python3 static modules built-in , instead dynamic loading</title>
		<link>https://www.bhzhu203.com/2025/06/17/%e9%9d%99%e6%80%81%e7%bc%96%e8%af%91python3%e7%a8%8b%e5%ba%8f%e6%a8%a1%e5%9d%97%e6%8c%87%e5%8d%97-how-to-make-python3-static-modules-built-in-instead-dynamic-loading/</link>
		
		<dc:creator><![CDATA[bhzhu203]]></dc:creator>
		<pubDate>Tue, 17 Jun 2025 09:28:08 +0000</pubDate>
				<category><![CDATA[源码编译]]></category>
		<category><![CDATA[模块]]></category>
		<category><![CDATA[编译]]></category>
		<category><![CDATA[静态]]></category>
		<guid isPermaLink="false">https://www.bhzhu203.com/?p=486</guid>

					<description><![CDATA[静态编译的Python3程序可以不依赖发行版库文件环境，几乎可以在任何发行版零依 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>静态编译的Python3程序可以不依赖发行版库文件环境，几乎可以在任何发行版零依赖运行。</p>



<h2 class="wp-block-heading">构建静态Python3的方法</h2>



<h3 class="wp-block-heading">前提条件</h3>



<p>建议在 <strong>Alpine Linux 的 Docker</strong> 中编译</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">步骤说明</h2>



<h3 class="wp-block-heading">1. 确定静态编译模块</h3>



<p>首先确定要静态编译进Python的模块，比如需要将 <code>asyncio</code> 模块静态编译到 python3，而 <code>asyncio</code> 会依赖其它的底层模块（<code>_socket</code>，<code>math</code>，<code>select</code>，<code>array</code>，<code>_posixsubprocess</code>，<code>_contextvars</code> 等），详细的官方库编译项可以在 <code>Modules/Setup</code> 中查找，需要一次次尝试查漏补缺。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">2. 恢复源码目录初始状态</h3>



<pre class="wp-block-code"><code>make distclean</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">3. 编写静态编译模块配置文件</h3>



<p>将需要静态编译的模块信息写到文件 <code>Modules/Setup.local</code> 中：</p>



<pre class="wp-block-code"><code>vi Modules/Setup.local</code></pre>



<p>内容如下：</p>



<pre class="wp-block-code"><code>*static*
_asyncio _asynciomodule.c
_socket socketmodule.c
math mathmodule.c _math.c -DPy_BUILD_CORE_MODULE
select selectmodule.c
array arraymodule.c
_posixsubprocess _posixsubprocess.c
_contextvars _contextvarsmodule.c
_struct _struct.c
binascii binascii.c</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">4. 执行 configure 配置</h3>



<pre class="wp-block-code"><code>./configure LDFLAGS="-static" --disable-shared</code></pre>



<p>检查环境中是否还缺少编译依赖。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">5. 检查 Modules/Setup.local 文件</h3>



<p>再次检查 <code>Modules/Setup.local</code> 文件，确保执行 <code>configure</code> 后没有被覆盖或者置空：</p>



<ul>
<li>如果被修改覆盖了，需要重新写入 <code>Modules/Setup.local</code>，再执行第四步 <code>./configure LDFLAGS="-static" --disable-shared</code>。</li>



<li>如果还是被覆盖了，检查 <code>configure</code> 过程中的报错。</li>



<li>还是不行的，删除当前源码，重新解压出原始源码，再次尝试。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">6. 执行编译</h3>



<p>根据实际情况进行多线程编译（<code>-j</code> 后面接线程数）：</p>



<pre class="wp-block-code"><code>make -j10 LDFLAGS="-static" LINKFORSHARED=" "</code></pre>



<ul>
<li><code>LDFLAGS="-static"</code> 代表是将静态编译的参数传进编译器</li>



<li><code>LINKFORSHARED=" "</code> 是置空 <code>LINKFORSHARED</code> 变量，避免编译出共享库 <code>so</code></li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">7. 测试运行</h3>



<p>当前目录直接测试运行是否正常，是否报缺失模块：</p>



<pre class="wp-block-code"><code>ldd ./python  # 查看执行文件是否静态
./python xxxx.py</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">8. 打包 Python3 程序</h3>



<p>程序运行正常就可以打包 python3 程序了（<code>bin</code> 文件 + <code>lib</code> <code>PY</code> 类型的依赖库）：</p>



<pre class="wp-block-code"><code>pwd
/root/0616/Python-3.9.23</code></pre>



<p>将程序临时安装在目录下的 <code>1</code> 路径：</p>



<pre class="wp-block-code"><code>make install LDFLAGS="-static" LINKFORSHARED=" " DESTDIR=/root/0616/Python-3.9.23/1</code></pre>



<p>将 <code>/root/0616/Python-3.9.23/2</code> 目录下的文件打包到目标环境上的机器即可运行：</p>



<pre class="wp-block-code"><code>ls /root/0616/Python-3.9.23/2/usr/local/lib/
libpython3.9.a  pkgconfig       python3.9</code></pre>



<p>执行以下命令复制文件到目标环境：</p>



<pre class="wp-block-code"><code>rsync -avP /root/0616/Python-3.9.23/2/usr/local/ root@new:/usr/local/
ln -sv /usr/local/bin/python3 /usr/bin/python3-static</code></pre>



<p>更简单的：只用复制静态 <code>python</code> 文件和 <code>usr/local/lib/python3.9</code> 到目标环境中即可。</p>



<p>官方文档（Building Python Statically）： https://wiki.python.org/moin/BuildStatically</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
