【发布时间】:2016-03-31 19:01:01
【问题描述】:
假设我想从命令行使用 gcc 来编译 Python 的 C 扩展。我会像这样构造调用:
gcc -o applesauce.pyd -I C:/Python35/include -L C:/Python35/libs -l python35 applesauce.c
我注意到-I、-L 和-l 选项是绝对必要的,否则您将收到类似于this 的错误。这些命令告诉 gcc 在哪里寻找头文件(-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, ...])
但是,其他人会有不同的平台和不同的 Python 安装结构,所以仅仅加入路径并不总是有效。
相反,我需要一个Python 中的解决方案,它能够可靠地返回include 和libs 目录。
编辑:
我查看了模块distutils.ccompiler,发现了许多有用的函数,这些函数部分使用了distutils,但可以为我定制它以使我的编译器完全跨平台。唯一的事情是,我需要将包含和运行时库传递给它...
编辑 2:
我查看了distutils.sysconfig,我能够可靠地返回包含所有头文件的“包含”目录。我仍然不知道如何获取运行时库。
distutils.ccompiler 文档是 here
需要这个功能的程序被命名为Cyther
【问题讨论】:
标签: python gcc static-libraries python-c-extension