Nic*_*lfi 5 python gcc static-libraries python-c-extension
让我们说我想gcc从命令行使用,以编译Python的C扩展.我将这样的调用结构如下:
gcc -o applesauce.pyd -I C:/Python35/include -L C:/Python35/libs -l python35 applesauce.c
Run Code Online (Sandbox Code Playgroud)
我注意到-I,-L和-l选项是绝对必要的,否则你会得到类似如下的错误此.这些命令告诉gcc在哪里查找headers(-I),在哪里查找静态库(-L),以及实际使用哪个静态库(python35实际转换为libpython35.a).
现在,显然很容易获得libs和include你的机器一样的目录,因为如果你不想让它们永远不会改变.但是,我正在编写一个gcc从命令行调用的程序,其他人将使用该程序.发生此调用的行看起来像这样:
from subprocess import call
import sys
filename = applesauce.c
include_directory = os.path.join(sys.exec_prefix, 'include')
libs_directory = os.path.join(sys.exec_prefix, 'libs')
call(['gcc', ..., '-I', include_direcory, '-L', libs_directory, ...])
Run Code Online (Sandbox Code Playgroud)
相反,我需要Python中的一个解决方案,它将可靠地返回include和libs目录.
我查看了该模块distutils.ccompiler,发现了许多有用的函数,它们部分地使用了distutils,但是让我可以自定义我的编译器完全跨平台.唯一的问题是,我需要传递包含和运行时库...
我看了一下distutils.sysconfig,我能够可靠地返回包含所有头文件的'include'目录.我仍然不知道如何获取运行时库.
该distutils.ccompiler文档是在这里
需要此功能的程序名为Cyther
编译扩展的最简单方法是使用distutils,像这样 ;
from distutils.core import setup
from distutils.extension import Extension
setup(name='foobar',
version='1.0',
ext_modules=[Extension('foo', ['foo.c'])],
)
Run Code Online (Sandbox Code Playgroud)
请记住,与unix/linux相比,在ms-windows上编译扩展并不简单,因为ms编译器的不同版本与相应的C库紧密耦合.因此,在ms-windows上,你必须使用编译Python xy的相同编译器编译Python xy的扩展.这意味着使用旧的和不受支持的工具,例如Python 2.7,3.3和3.4.Python 3.5 的情况正在发生变化(第1部分,第2部分).
编辑:
更多地研究了问题,我怀疑你想要的是100%可实现的.鉴于编译和链接所需的工具按照定义在Python之外,并且它们甚至不一定是Python编译的工具,因此信息中的信息sys并sysconfig不能保证实际安装Python的系统的准确表示. .例如,大多数ms-windows机器都没有安装开发人员工具.甚至在POSIX平台上,安装的C编译器和构建Python的编译器之间可能存在差异,尤其是当它作为二进制包安装时.
| 归档时间: |
|
| 查看次数: |
149 次 |
| 最近记录: |