You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

python3-config --ldflags缺失-lpython3.x致链接失败问题咨询

问题描述

使用g++构建示例Cython应用时,出现链接错误undefined reference to 'Py_Finalize'。由python3-config提供的Python链接参数不完整,手动添加-lpython3.x后,构建成功且可执行文件能正常运行。

复现步骤

通过Docker创建最小复现示例,待编译文件main.cpp内容如下:

#include <Python.h>
#include <iostream>

int main() {
  Py_Initialize();
  std::cout << "Python initialized" << std::endl;
  Py_Finalize();
}

对应的Dockerfile内容:

FROM ubuntu:22.04

RUN apt-get update -y && \
    apt-get install -y build-essential python3.10 libpython3.10 python3-dev libpython3-dev

COPY main.cpp /root
RUN g++ -g $(python3-config --cflags) /root/main.cpp $(python3-config --ldflags) -o /root/main

测试环境为Ubuntu 22.04(20.04也存在相同问题)、Python 3.10(3.8、3.9同样存在该问题)。

观察结果

构建日志如下:

Step 4/4 : RUN g++ -g $(python3-config --cflags) /root/main.cpp $(python3-config --ldflags) -o /root/main
 ---&gt; Running in b60bbdb5d14f
/usr/bin/ld: /tmp/ccU46Ddl.o: in function `main':
/root/main.cpp:5: undefined reference to `Py_Initialize'
/usr/bin/ld: /root/main.cpp:7: undefined reference to `Py_Finalize'
collect2: error: ld returned 1 exit status
The command '/bin/sh -c g++ -g $(python3-config --cflags) /root/main.cpp $(python3-config --ldflags) -o /root/main' returned a non-zero code: 1

缺失Python3库中的Py_Initialize和Py_Finalize符号。python3-config --ldflags的输出为:

-L/usr/lib/python3.10/config-3.10-x86_64-linux-gnu -L/usr/lib/x86_64-linux-gnu  -lcrypt -ldl  -lm -lm 

手动添加-lpython3.10选项后构建成功:

Step 4/4 : RUN g++ -g $(python3-config --cflags) /root/main.cpp $(python3-config --ldflags) -lpython3.10 -o /root/main && /root/main
 ---&gt; Running in c2551fbfa979
Python initialized
Removing intermediate container c2551fbfa979
 ---&gt; 47303fef29ad
Successfully built 47303fef29ad

在Debian+Python3.7环境(Docker镜像python:3.7-slim)中,python3-config --ldflags输出包含lpython3.7m:

$ docker run -it python:3.7-slim python3-config --ldflags
 -L/usr/local/lib -lpython3.7m -lcrypt -lpthread -ldl  -lutil -lm 

在Debian+Python3.10环境(Docker镜像python:3.10-slim)中,同样存在该问题:

$ docker run -it python:3.10-slim python3-config --ldflags
 -L/usr/local/lib  -lcrypt -lpthread -ldl  -lutil -lm -lm 
疑问
  1. 为何python3-config未提供构建该应用所需的全部链接选项?
  2. 是否需要手动添加-lpython3.10,或有更跨平台的解决方法?
  3. python3-config的输出是否存在错误,为何重复包含-lm?

内容的提问来源于stack exchange,提问作者Green 绿色

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 12:40:53