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

Ubuntu18.04下GCC编译Python C API找不到Python.h及符号未定义问题

问题解决说明

前置检查

  • 首先确保已安装Python 3.8开发包,执行命令:sudo apt install -y python3.8-dev

错误原因梳理

  1. 参数混淆:-I用于指定头文件搜索路径,-L用于指定库文件搜索路径,-l用于指定链接的库名,你之前混用三类参数导致头文件、库找不到的报错
  2. 链接逻辑问题:编译共享库时,链接器默认允许未定义符号存在,默认符号在库加载时由上层调用方提供,所以你加了-lpython3.8仍会显示符号未定义
  3. 参数顺序错误: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 16:36:02