为了将 Python 解释器嵌入应用程序,找到正确的编译参数传给编译器 (和链接器) 并非易事,特别是因为 Python 加载的库模块是以 C 动态扩展(.so 文件)的形式实现的。
为了得到所需的编译器和链接器参数,可执行 pythonX.Y-config 脚本,它是在安装 Python 时生成的(也可能存在 python3-config 脚本)。该脚本有几个参数,其中以下几个参数会直接有用:
pythonX.Y-config --cflags 将给出建议的编译参数。
/opt/bin/python3.11-config --cflags
-I/opt/include/python3.11 -I/opt/include/python3.11 -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall
pythonX.Y-config --ldflags --embed 将给出在链接时建议的旗标:
/opt/bin/python3.11-config --ldflags --embed
-L/opt/lib/python3.11/config-3.11-x86_64-linux-gnu -L/opt/lib -lpython3.11 -lpthread -ldl -lutil -lm
备注 为了避免多个 Python 安装版本引发混乱(特别是在系统安装版本和自己编译版本之间),建议用 pythonX.Y-config 指定绝对路径,如上例所述。
如果上述方案不起作用(不能保证对所有 Unix 类平台都生效;欢迎提出 bug 报告),就得阅读系统关于动态链接的文档,并检查 Python 的 Makefile (用 sysconfig.get_makefile_filename() 找到所在位置)和编译参数。这时 sysconfig 模块会是个有用的工具,可用编程方式提取需组合在一起的配置值。比如:
>>>
import sysconfig
sysconfig.get_config_var('LIBS')
'-lpthread -ldl -lutil'
sysconfig.get_config_var('LINKFORSHARED')
'-Xlinker -export-dynamic' |