经验丰富的问题??显然来自链接器(gcc在引擎盖下启动了一个链接器,看到它 – 只需用详细模式启动带有-v的gcc).那么让我们先简要提醒链接过程如何工作:

链接器保留其需要解析的所有符号的名称.在开始时它只是符号main.当链接器检查库时会发生什么?

>如果它是一个静态库,链接器将查看此库中的每个目标文件,如果此目标文件定义了一些查找符号,则包含整个目标文件(这意味着某些符号将被解析,但还有一些新的未解析符号)可以添加).链接器可能需要在静态库上多次传递.

>如果它是共享库,链接器将其视为由单个巨大目标文件组成的库(毕竟,我们必须在运行时加载此库,而不必多次传递和修剪未使用的符号):如果至少有一个需要的符号,整个库是“链接的”(并非真正的链接在运行时发生,这是一种干运行),如果不是 – 整个库被丢弃,再也没有看过.

例如,如果您链??接:

gcc -L/path -lpython3.x foo.o

无论python3.x是共享库还是静态库,你都会遇到问题:当链接器看到它时,它只查找符号main,但是这个符号没有在python-lib中定义,所以它是python -lib被丢弃,再也没有看过了.只有当链接器看到对象文件foo.o时,才意识到需要整个Python-Symbols,但现在已经太晚了.

有一个简单的规则来处理这个问题:首先放置目标文件!这意味着:

gcc -L/path foo.o -lpython3.x

现在,链接器在第一次看到python-lib时就会知道它需要什么.

还有其他方法可以实现类似的结果.

A)只要每次扫描添加至少一个新符号定义,就让链接器重复一组归档:

gcc -L/path --Wl,-start-group -lpython3.x foo.o -Wl,-end-group

链接器选项-Wl,-start-group和-Wl,-end-group表示链接器在这组归档上不止一次迭代,因此链接器有第二次机会(或更多)包含符号.此选项可能会导致更长的链接时间.

B)启用选项–no-as-needed将导致链接的共享库(并且只有共享库),无论在此库中是否需要定义符号.

gcc -L/path -Wl,-no-as-needed -lpython3.x -Wl,-as-needed foo.o

实际上,默认的ld-behavior是–no-as-needed,但是gcc-frontend使用选项–as-needed调用ld,所以我们可以通过在python之前添加-no-as-needed来恢复行为 – 库然后再将其关闭.

现在你的静态链接问题.我不认为使用所有标准库的静态版本(以上都是glibc)是不可取的,你应该做的就是静态链接python-library.

链接的规则很简单:默认情况下,链接器首先尝试打开库的共享版本而不是静态版本.即对于库libmylib和路径A和B,即

-L/A -L/B lmylib

它尝试按以下顺序打开库:

A/libmylib.so

A/libmylib.a

B/libmylib.so

B/libmylib.a

因此,如果文件夹A只有静态版本,则使用此静态版本(无论文件夹B中是否存在共享版本).

因为实际上使用了库是非常不透明的 – 它取决于系统的设置,通常会通过-Wl打开链接器的记录,-verbose来进行故障排除.

通过使用-Bstatic选项,可以强制使用库的静态版本:

gcc foo.o -L/path -Wl,-Bstatic -lpython3.x -Wl,-Bdynamic -Wl,-verbose -o foo

值得注意的事:

> foo.o在库之前链接.

>在python-library之后直接关闭静态模式,以便动态链接其他库.

现在:

gcc L/paths foo.c -Wl,-Bstatic -lpython3.X -Wl,-Bdynamic -o foo -Wl,-verbose

...

attempt to open path/libpython3.6m.a succeeded

...

ldd foo shows no dependency on python-lib

./foo

It works!

是的,如果您链??接静态glibc(我不建议),您将需要从命令行删除-Xlinker -export-dynamic.

在没有-Xlinker -export-dynamic的情况下编译的可执行文件将无法加载某些c-extension,这些扩展依赖于使用ldopen加载它们的可执行文件的这个属性.

python 动态编译代码_编译Python代码以使用Cython静态链接可执行文...相关推荐

  1. python动态爱心曲线_用Python来画一条动态心形曲线

    欢迎关注[拇指笔记],持续更新一些好玩.有趣的Python小项目. 需要程序的朋友,直接私信我即可. 原文链接[Python]五分钟画一条动态心形曲线~​mp.weixin.qq.com 先上效果使用 ...

  2. python动态爱心曲线_【Python】五分钟画一条动态心形曲线~

    0.最终效果 1.绘制一条心形曲线 最近看到个视频,打算绘制个心型动态的曲线. 1.1 Matlab确定图像及其函数 网上有很多关于心形曲线的资料,各种各样的形状,但是我比较倾心于桃心形.先在Matl ...

  3. python动态数组实现_利用python实现动态数组

    一.数组 说动态数组之前,首先要说数组,数组是一种顺序存储的线性表,所有元素的内存地址都是连续的.数组的最大优点是他的查找时间复杂度能够达到O(1),但是增和删的时间复杂度较高O(n) 二.动态数组 ...

  4. python动态仪表图_《Python数据可视化之Matplotlib与Pyecharts》之仪表盘

    11.3.2  企业2019年销售业绩完成率 为了分析该企业在2019年的销售业绩完成情况,绘制了销售额的仪表盘,Python代码如下: # -*- coding: utf-8 -*- #声明Note ...

  5. 用python画一个房子_用Python动态地画一个房子

    用Python动态地画一个房子 Python代码狂人 Python代码大全 用Python动态画一个房子,我们可从上向下画,先画房顶,再依次画阁楼窗户.房屋主体.屋门及主屋窗户. 运行本程序前请确保已 ...

  6. python 预编译加速_让Python代码运行更快的最佳方式

    Python因其强大.灵活且易于使用等特性,而赢得了声誉.这些优点使其在各种各样的应用程序.工作流程和领域中得到了广泛应用.但是就语言的设计,也就是它天然的解释能力还有它的运行时的动态性而言,Pyth ...

  7. python语言是编译执行_加速Python运行的工具

    加速Python运行的工具应用 如果你需要让你的Python程序加速运行,在不同的层次有一些不同的解决方案: 重写 你的 Python 代码, 通过 并行化parallelizing 和 优化opti ...

  8. python编译原理_编译原理实战课 带你吃透编译技术核心概念与算法

    编译原理实战课,我们到底要学些什么? 在这门课程里,宫老师精选出了Java.Java JIT.Python.JavaScript.Julia.Go.MySQL这7种真实编程语言的编译器,带你阅读它们的 ...

  9. c++hello world代码_在 Rust 代码中编写 Python 是种怎样的体验?

    作者 | Mara Bos,Rust资深工程师译者 | Arvin 责编 | 屠敏头图 | CSDN 下载自东方 IC出品 | CSDN(ID:CSDNnews) 以下为译文: 大约一年前,我发布了一 ...

最新文章

  1. Lua生成Guid(uuid)
  2. Ubuntu 16.04安装QQ(不一定成功)
  3. 终端输入参数:argparse和sys.argv[]的用法
  4. Groovy开发语言
  5. 基于XML的IOC案例
  6. java死循环_java小白关于while死循环时处理办法的一发求助帖
  7. 微服务流控防护场景与应对措施
  8. python发邮件脚本_Python实现的简单发送邮件脚本分享
  9. 嵌入式操作系统内核原理和开发(信号量)
  10. GotoAndPlay 图论
  11. 设计递归算法,删除不带头结点的单链表L中所有值为X的结点
  12. 车牌识别计算机应用领域,车牌识别全方位应用 引领智能交通新趋势
  13. 2012共享文件服务器,win server2012 r2 服务器共享文件夹设置
  14. 基线管理之Windows安全配置
  15. CAD中画一条直线与两个圆相切
  16. 22-02-08数据库迁移sql问题
  17. 感激爸妈----您们辛苦了
  18. 【Tool工具】LICEcap 推荐 GIf录制工作- 如何简单录制一个gif(Mac Window都可)
  19. Scratch3.0 二次开发环境部署(一)
  20. nas linux手机照片备份,本身着手,组建简洁好用的NAS!(存储同步篇)

热门文章

  1. java中 与%_java中“/”与“%”的区别
  2. 只用一个marker 替换 高德_关于高德地图添加Marker遇到的一些坑
  3. 迷宫问题c语言报告,c语言写的迷宫问题
  4. java实现空心四边形_Java输入数值形成对应的平行四边形,正三角形,棱形,空心棱形...
  5. git 合并提交 error: cannot ‘squash‘ without a previous commit
  6. Head First设计模式读书笔记八 第九章上 迭代器模式
  7. 艾蔻智能机器人怎么连接网络_艾蔻扫地机器人z3怎么用?
  8. JAVA 使用类的继承和接口实现多态
  9. python线性回归实例_python线性回归示例
  10. vuejs对象更新渲染_vue 数组和对象渲染问题