当前位置: 首页 > 面试题库 >

编译python模块扩展时如何静态链接库

范霄
2023-03-14
问题内容

我想修改setup.py文件,以便命令“ python setup.py build”编译基于C的扩展模块,该模块静态(而非动态)链接到库。

该扩展程序当前动态链接到许多库。除了静态链接到一个库外,我想保留所有内容。我已经成功地通过手动修改了对distutils运行的gcc的调用来完成了此操作,尽管它要求我明确列出相关库。

也许这是太多信息,但是为了清楚起见,这是在“ python setup.py build”脚本期间执行的最终链接命令:

gcc -pthread -shared -L/system/lib64 -L/system/lib/ -I/system/include build/temp.linux-x86_64-2.7/src/*.o -L/system/lib -L/usr/local/lib -L/usr/lib -ligraph -o build/lib.linux-x86_64-2.7/igraph/core.so

这是我的手动修改:

gcc -pthread -shared -L/system/lib64 -L/system/lib/ -I/system/include build/temp.linux-x86_64-2.7/src/*.o -L/system/lib -L/usr/local/lib -L/usr/lib /system/lib/libigraph.a -lxml2 -lz -lgmp -lstdc++ -lm -ldl -o build/lib.linux-x86_64-2.7/igraph/core.so

分发Python模块的2.3.4节讨论了库的规范,但是仅“
library_dirs”是合适的,并且这些库是动态链接的。

我正在使用Linux环境进行开发,但是该软件包也将被编译并安装在Windows上,因此我需要一种可移植的解决方案。

有人可以告诉我在哪里寻找说明,或如何修改setup.py脚本吗?(提前致谢!)

我是StackOverflow的新手,所以很抱歉,如果我没有正确标记此问题,或者在发布中犯了其他错误。


问题答案:

如果所有其他方法都失败了,那么对于构建器来说,总是有很少的文档extra_compile_argsextra_link_args选项Extension。(另请参见此处。)

但是,您可能需要破解一些与OS相关的代码,以获取特定平台的正确参数格式。



 类似资料:
  • 问题内容: 我正在按照本教程讲解如何使用C\ C ++代码扩展Python。 名为“使用Microsoft Windows的GCC构建扩展模块”部分对我来说失败,并出现以下错误: 名为“使用Microsoft Visual C ++构建扩展模块”的部分也失败,并显示类似错误: 我应该怎么做才能解决这个问题? 问题答案: 您是否拥有python dev文件,以便可以找到Python.h? 您是否已将

  • 问题内容: 我在Ubuntu(arm-linux-gnueabi- gcc)中有一个ARM交叉编译器,默认体系结构是ARMv7。但是,我想编译一个ARMv5二进制文件。我通过为编译器提供选项来实现。 到目前为止,一切都很好。由于我的ARM系统使用BusyBox,因此必须编译静态链接的二进制文件。所以我给gcc 选项。 但是,链接器链接到我的ARMv5二进制文件的 libc.a 出现问题。该文件使用

  • 我正在开发一个包(模块?)设计为pip安装。该包包含一个C扩展,使用pybind11包装,它链接到其他一些库。 我能够手动编译和链接扩展库,没有问题,但是我无法正确配置我的文件,以便在调用时安装扩展模块。 我一直遵循这段代码(pybind11文档链接到)来配置我的文件,包含在下面。 为完整起见,我的包目录如下所示: 我按如下方式调用pip3安装: (版本检查被禁用,因为机器无法访问互联网)。 我可

  • dc_motor_driver --- 双直流电机驱动模块 功能相关函数 dc_motor_driver.set_power(speed, ch = 0) 设置双路直流电机各路电机的动力,参数: speed 控制目标电机的动力值,参数范围是 -100 ~ 100。 ch 控制的电机通道,参数范围是 0 ~ 2,其中 0 表示两路电机通道,1 表示插槽1通道,2 表示插槽2通道。 程序示例 impo

  • 问题内容: 我有几个python模块(组织成包),它们 相互依赖 。例如 模块1 Module2:导入Module1 模块3 Module4:导入Module3,Module 2,Module 1 假设开发应用程序的相关接口在Module4中,而我想使用 cython 生成 Module4.so 。如果我以幼稚的方式进行操作,则会得到扩展Module4.so,但可以导入该扩展, 但 该扩展 依赖于

  • 问题内容: 我试图将静态库(与gcc一起编译)链接到C 程序,但出现了“未定义引用”。我在ubuntu 12.04服务器计算机上使用了gcc和g 版本4.6.3。例如,这是阶乘方法的简单库文件: mylib.h mylib.c 我使用gcc为此mylib.c创建了对象: 再次使用AR实用工具从目标文件创建了静态库: 我用C程序(test.c)和C ++程序(test.cpp)测试了这个库 C和C