Ubuntu18.04下GCC编译Python C API找不到Python.h及符号未定义问题
问题解决说明
前置检查
- 首先确保已安装Python 3.8开发包,执行命令:
sudo apt install -y python3.8-dev
错误原因梳理
- 参数混淆:
-I用于指定头文件搜索路径,-L用于指定库文件搜索路径,-l用于指定链接的库名,你之前混用三类参数导致头文件、库找不到的报错 - 链接逻辑问题:编译共享库时,链接器默认允许未定义符号存在,默认符号在库加载时由上层调用方提供,所以你加了
-lpython3.8仍会显示符号未定义 - 参数顺序错误:gcc的库相关参数(
-L/-l系列)需要放在源文件/目标文件之后,顺序错误会导致链接失效
正确编译命令
场景1:编译为可直接运行的可执行文件
gcc Python_Math.c -o Python_Math -v -fPIC -I/usr/include/python3.8 -L/usr/lib/python3.8/config-3.8-x86_64-linux-gnu -lpython3.8 -lcrypt -lpthread -ldl -lutil -lm -Wall
编译完成后执行./Python_Math即可运行,所有Python相关符号均已完成链接。
场景2:编译为供其他程序调用的共享库
gcc Python_Math.c -o libPython_Math.so -v -shared -fPIC -Wl,--no-undefined -I/usr/include/python3.8 -L/usr/lib/python3.8/config-3.8-x86_64-linux-gnu -lpython3.8 -lcrypt -lpthread -ldl -lutil -lm -Wall
这里额外添加了-Wl,--no-undefined参数,强制链接器在编译阶段就完成所有符号的绑定,编译完成后用nm检查不会再出现Python相关符号未定义的问题。
额外注意
- 不需要用sudo执行编译命令,普通用户权限即可,sudo反而可能引发后续文件权限问题
- 如果系统中同时存在多个Python版本,可通过
which python3.8确认路径后调整-I和-L的参数值即可
内容的提问来源于stack exchange,提问作者RTC222
相关产品推荐
相关产品推荐

