如何静态编译构建 Python

2015-03-29 06:58:08 +08:00
 Septembers
按照 https://wiki.python.org/moin/BuildStatically 构建出来依然有动态库依赖
请问是我的打开方式错误吗?


Ubuntu Desktop 14.04.2 ( x86_64 )
8141 次点击
所在节点    Python
12 条回复
memorybox
2015-03-29 08:28:57 +08:00
Septembers
2015-03-29 08:31:04 +08:00
@memorybox 感谢 但是我还是需要知道如何静态编译官方版本 谢谢
AstroProfundis
2015-03-29 11:33:23 +08:00
./configure --xxx --xxx LDFLAGS="-static"
make xxx LDFLAGS="-all-static"

这样试试
Septembers
2015-03-29 11:38:40 +08:00
@AstroProfundis
gcc: error: unrecognized command line option '-all-static'
v2exhehehehe
2015-03-29 13:49:08 +08:00
1楼给出的项目倒是有说明怎么扩展、自定义、重编译的说明,可以去看看里面的build.sh

你给出的页面有这样一句话:This page is a placeholder until MicahElliott (or anyone) figures out all the steps to make this work.
这只是占位符,直到有人弄清所有步骤,看样子还没有人静态编译成功过,祝lz好运。
Septembers
2015-03-29 14:02:58 +08:00
@wongsyrone
我需要静态构建Python 2.7.3(那个项目有版本强依赖 唉
memorybox
2015-03-29 14:16:09 +08:00
我曾经在centos上做过Python2.7.8的编译, 也是碰到了各种问题,后来直接用人家现成的了。

之前在cpyUG邮件列表里面见过有人做类似的东西:

https://github.com/auxten/miniPyRuntime

这个是基于python2.7.3的,但是它依赖于这些库:
$:ldd dist/bin/python
linux-vdso.so.1 => (0x00007fff170d3000)
libkrb5.so.3 => /lib64/libkrb5.so.3 (0x0000003a8aa00000)
libkrb5support.so.0 => /lib64/libkrb5support.so.0 (0x0000003a8ba00000)
libk5crypto.so.3 => /lib64/libk5crypto.so.3 (0x0000003a8a600000)
libz.so.1 => /lib64/libz.so.1 (0x0000003a89a00000)
libsqlite3.so.0 => /usr/lib64/libsqlite3.so.0 (0x0000003f75600000)
libbz2.so.1 => /lib64/libbz2.so.1 (0x0000003f79a00000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003f75200000)
libdl.so.2 => /lib64/libdl.so.2 (0x0000003f74e00000)
libutil.so.1 => /lib64/libutil.so.1 (0x0000003f78600000)
libm.so.6 => /lib64/libm.so.6 (0x00007f1a1bb78000)
libc.so.6 => /lib64/libc.so.6 (0x0000003f74a00000)
libcom_err.so.2 => /lib64/libcom_err.so.2 (0x0000003a8a200000)
libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x0000003a8b600000)
libresolv.so.2 => /lib64/libresolv.so.2 (0x0000003f76e00000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x0000003a89e00000)
/lib64/ld-linux-x86-64.so.2 (0x0000003f74600000)

可以参考一下它的裁剪方法。

PS:这个项目我没有用过。我用了之前推荐的StaticPython很长一段时间,非常稳定。
Septembers
2015-03-29 16:04:38 +08:00
@memorybox @wongsyrone @AstroProfundis
现在已经实现静态编译但是独立复制出来无法使用
编译环境信息:
Kernel 3.16
Ubuntu Desktop 14.04.2 LTS
GCC 4.8.2
编译:
curl https://www.python.org/ftp/python/2.7.3/Python-2.7.3.tgz | tar zxv
cd Python-2.7.3
./configure --disable-shared LDFLAGS="-s -static -static-libgcc" CPPFLAGS="-static"
echo '*static*' > Modules/Setup.local
make python -j LINKFORSHARED=""
测试:
➜ Python-2.7.3 ldd ./python
not a dynamic executable
➜ Python-2.7.3 ./python
Python 2.7.3 (default, Mar 29 2015, 15:51:50)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> exit()
➜ Python-2.7.3 cp ./python ..
➜ Python-2.7.3 ../python
Could not find platform independent libraries <prefix>
Could not find platform dependent libraries <exec_prefix>
Consider setting $PYTHONHOME to <prefix>[:<exec_prefix>]
ImportError: No module named site
➜ Python-2.7.3

请问这个问题怎么解决谢谢
AstroProfundis
2015-03-29 19:58:03 +08:00
@Septembers 这个应该是文件静态编译好了,但你复制走的时候要带上全部的 lib, python 自己的那些 lib 还是和主程序分开的(各种 .py 之类的),解掉的依赖应该是对系统 glibc 的,印象中似乎见过全部编译成一个可执行文件的 python, 好像就是前面那个 staticpython
hahafofo
2015-05-05 16:51:46 +08:00
解决ImportError: No module named site,如果是c程序调用,链接到libpython2.7.a,在c程序里面加上这3行就可以了。

Py_NoSiteFlag = 1;
Py_FrozenFlag = 1;
Py_IgnoreEnvironmentFlag = 1;


Py_SetPythonHome("");
Py_SetProgramName("");

如果不是编译c程序,需要设置$PYTHONHOME
jamesarch
2018-04-26 14:41:03 +08:00
jamesarch
2018-04-26 14:42:43 +08:00
。我试了下官方构建可以的 _(:з)∠)_

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/180051

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX