当前位置: 首页 > news >正文

荷兰网站后缀/自己做网站的软件

荷兰网站后缀,自己做网站的软件,做外贸网站怎么做,兴化建设局网站工作中需要自行编译一个Python二进制程序,并尽量减少该程序依赖的库文件,使之在相同CPU架构上有更良好的可移植性。先找了下网上的资料,都不太详尽,经过探索最终还是成功了,这里记录一下过程以备忘。 过程记录 查阅Pyt…

工作中需要自行编译一个Python二进制程序,并尽量减少该程序依赖的库文件,使之在相同CPU架构上有更良好的可移植性。先找了下网上的资料,都不太详尽,经过探索最终还是成功了,这里记录一下过程以备忘。

过程记录

查阅Python27源码中的setup.py文件,发现Python核心仅依赖glibc,c++等标准库,因此按以下默认的编译命令即可编译出依赖较少的Python二进制程序了。# 安装必要的编译工具链

sudo yum install -y gcc make gcc-c++ glibc-static libstdc++-static

curl -O https://www.python.org/ftp/python/2.7.13/Python-2.7.13.tgz

tar -xf Python-2.7.13.tgz && cd Python-2.7.13

# 注意这里添加了选项静态链接libgcc和libstdc++

LDFLAGS="-static-libgcc -static-libstdc++" ./configure --prefix=/usr/local/python27 --with-cxx-main=/usr/bin/g++

make -j4 > make.log

make install

我用ldd命令检查下Python二进制程序依赖的库文件:[root@centos-linux-7 deps]# ldd /usr/local/python27/bin/python

linux-vdso.so.1 => (0x00007fff78de8000)

libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f8b2253a000)

libdl.so.2 => /lib64/libdl.so.2 (0x00007f8b22336000)

libutil.so.1 => /lib64/libutil.so.1 (0x00007f8b22133000)

libm.so.6 => /lib64/libm.so.6 (0x00007f8b21b2a000)

libc.so.6 => /lib64/libc.so.6 (0x00007f8b21547000)

/lib64/ld-linux-x86-64.so.2 (0x00007f8b22756000)

发现依赖的库文件确实都是系统核心库文件,大部分Linux系统上均有这些库文件,因此可以断定将编译好的python程序拷贝到其它Linux系统上是可以执行的。

但我发现Python程序的执行并不是只使用了python这个二进制程序,在其加载某些python模块是会动态加载该模块对应的动态链接库文件。因此我用ldd命令检查下各python模块的动态库文件的依赖情况:[root@centos-linux-7 Python-2.7.13]# find . -name '*.so'|xargs ldd

./build/lib.linux-x86_64-2.7/_socket.so:

linux-vdso.so.1 => (0x00007ffdba579000)

libm.so.6 => /lib64/libm.so.6 (0x00007ff0d8ded000)

libpthread.so.0 => /lib64/libpthread.so.0 (0x00007ff0d8bd1000)

libc.so.6 => /lib64/libc.so.6 (0x00007ff0d8804000)

/lib64/ld-linux-x86-64.so.2 (0x00007ff0d9304000)

......

./build/lib.linux-x86_64-2.7/_curses.so:

linux-vdso.so.1 => (0x00007ffd61969000)

libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f6a52b86000)

libc.so.6 => /lib64/libc.so.6 (0x00007f6a527b9000)

/lib64/ld-linux-x86-64.so.2 (0x00007f6a52fe5000)

这么一看绝大部分python模块的动态库文件也是仅依赖系统核心库文件,一切都挺美好!

但在我的场景里,python编译时还需要启用ssl、hashlib、readline等模块,而这些模块编译时会依赖系统非核心库文件,我分析Python源代码目录下的setup.py文件,发现依赖关系如下:ssl、hashlib依赖于libssl、libcrypto,而libssl、libcrypto又依赖libz。

readline依赖libreadline、libncurses。

于是这里先编译安装这些非核心库文件:# 注意由于这些库文件后面都需要链接进python模块对应的动态库文件,所以下面编译的非核心库均要使用-fPIC选项,并且都只编译出静态库文件

mkdir -p deps/src

cd deps/src

curl -O https://zlib.net/zlib-1.2.11.tar.gz

tar -xf zlib-1.2.11.tar.gz && cd zlib-1.2.11

CFLAGS='-fPIC' ./configure --prefix=`pwd`/../../zlib --static

make -j4 && make install

cd ..

curl -O https://www.openssl.org/source/openssl-1.0.2q.tar.gz

tar -xf openssl-1.0.2q.tar.gz && cd openssl-1.0.2q

./Configure zlib --prefix=`pwd`/../../ssl --openssldir=`pwd`/../../ssl linux-x86_64 --with-zlib-lib=`pwd`/../../zlib/lib --with-zlib-include=`pwd`/../../zlib/include -fPIC

make -j4 && make install

cd ..

curl -O http://ftp.ntu.edu.tw/gnu/ncurses/ncurses-5.9.tar.gz

tar -xf ncurses-5.9.tar.gz && cd ncurses-5.9

CPPFLAGS="-fPIC" ./configure --prefix=`pwd`/../../ncurses

make -j4 && make install

cd ..

curl -O http://ftp.ntu.edu.tw/gnu/readline/readline-6.2.tar.gz

tar -xf readline-6.2.tar.gz && cd readline-6.2

CPPFLAGS="-fPIC" ./configure --prefix=`pwd`/../../readline --disable-shared

make -j4 && make install

cd ..

cd ../..

最后重新编译Python:# 注意这里添加了选项静态链接libgcc和libstdc++,还指定了一些头文件目录及库文件目录

CPPFLAGS="-I`pwd`/deps/zlib/include -I`pwd`/deps/ssl/include -I`pwd`/deps/readline/include -I`pwd`/deps/ncurses/include -I`pwd`/deps/ncurses/include/ncurses" LDFLAGS="-static-libgcc -static-libstdc++ -L`pwd`/deps/zlib/lib -L`pwd`/deps/ssl/lib -L`pwd`/deps/readline/lib -L`pwd`/deps/ncurses/lib" ./configure --prefix=/usr/local/python27 --with-cxx-main=/usr/bin/g++

make -j4 && make install

最后检查下编译出的python二进制程序文件及各模块的动态库文件,发现仅依赖系统核心库文件,效果很好:[root@centos-linux-7 python27]# ldd /usr/local/python27/bin/python

linux-vdso.so.1 => (0x00007ffc54fe8000)

libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f9774b3d000)

libdl.so.2 => /lib64/libdl.so.2 (0x00007f9774939000)

libutil.so.1 => /lib64/libutil.so.1 (0x00007f9774736000)

libm.so.6 => /lib64/libm.so.6 (0x00007f9774434000)

libc.so.6 => /lib64/libc.so.6 (0x00007f9774067000)

/lib64/ld-linux-x86-64.so.2 (0x00007f9774d59000)

[root@centos-linux-7 python27]# find /usr/local/python27 -name '*.so'|xargs ldd

/usr/local/python27/lib/python2.7/lib-dynload/nis.so:

linux-vdso.so.1 => (0x00007fff42b14000)

libnsl.so.1 => /lib64/libnsl.so.1 (0x00007fbc2ad4f000)

libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fbc2ab33000)

libc.so.6 => /lib64/libc.so.6 (0x00007fbc2a766000)

/lib64/ld-linux-x86-64.so.2 (0x00007fbc2b16d000)

......

/usr/local/python27/lib/python2.7/lib-dynload/_codecs_cn.so:

linux-vdso.so.1 => (0x00007fff695db000)

libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f421bd72000)

libc.so.6 => /lib64/libc.so.6 (0x00007f421b9a5000)

/lib64/ld-linux-x86-64.so.2 (0x00007f421c1b2000)

安装其它第三方python模块的方法与上面的过程很类似了,这里就不赘述了。

总结

手工编译一个python不难,但如果要尽可能少地依赖系统中库文件,这时要考虑的问题就比较多了。通过本次探索,对GCC的编译过程有了更深刻的认识,也基本掌握了CFLAGS、CPPFLAGS、LDFLAGS等常见编译参数的用法。

参考

http://www.lbrq.cn/news/1606321.html

相关文章:

  • 浦江做网站/常州网站优化
  • 微网站怎么做/可以看任何网站的浏览器
  • 深圳福田专业网站建设/关键词搜索工具好站网
  • asp动态网站开发教程负责人/株洲seo优化报价
  • 三亚做网站多少钱一平方/百家号seo怎么做
  • 商务网站建设的流程图/百度推广客户端mac版
  • 鹰潭做网站的公司/seo优化网站网页教学
  • 深圳做微信网站设计/全国疫情最新数据
  • 高端建站设计/2022年seo还值得做吗
  • 个人网站 如何做推广/被代运营骗了去哪投诉
  • 全屏滚动企业网站模板/企业关键词优化专业公司
  • 建设云个人网站/策划方案模板
  • 电线电缆技术支持中山网站建设/站长之家爱站网
  • 信息网站开发网络公司/百度客服平台
  • 医疗器械网站建设方案/地推扫码平台
  • 专业做婚庆的网站/快速优化系统
  • 好优化网站设计/成全高清免费观看mv
  • 合肥网站设计品牌/百度推广登陆首页
  • 网络公司 网站源码/企业管理培训班哪个好
  • 做网站要买什么服务器/互联网项目推广平台有哪些
  • 贵州住房建设厅网站/网络营销岗位招聘信息
  • 体育馆做网站公司/不属于网络推广方法
  • 中山技术支持中山网站建设/酒店推广渠道有哪些
  • 学习网站建设/深圳网络推广外包
  • 安阳做网站公司/网络营销和网站推广的区别
  • wordpress评论 图片/谷歌seo是指什么意思
  • 服务平台管理系统/seo综合排名优化
  • python适合网站开发吗/网络推广一个月工资多少
  • 城乡规划师证报考条件/广州seo推荐
  • 全球疫情防控最新消息/东莞网络优化排名
  • 区块链 和 一致性哈希的结合
  • React中的Hooks
  • 关于Web前端安全防御之内容安全策略(CSP)
  • 【昇腾推理PaddleOCR】生产级部署方式
  • [mssql] 分析SQL Server中执行效率较低的SQL语句
  • FFmpeg+javacpp中纯音频播放