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 ---> 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 ---> Running in c2551fbfa979 Python initialized Removing intermediate container c2551fbfa979 ---> 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
疑问
- 为何
python3-config未提供构建该应用所需的全部链接选项? - 是否需要手动添加
-lpython3.10,或有更跨平台的解决方法? python3-config的输出是否存在错误,为何重复包含-lm?
内容的提问来源于stack exchange,提问作者Green 绿色
相关产品推荐
相关产品推荐

