Python3.8 C API嵌入开发libpython3.8符号未定义问题咨询
问题原因与解决方法
核心问题1:符号未定义的原因
- 链接顺序错误:GCC 链接时依赖从左到右的符号依赖解析顺序,你所有编译命令都把
-lpython3.8(含python3-config输出的链接参数)放在了源文件Python_Math.c前面,链接器扫描库的时候还未遇到源文件里的Python C API调用,直接跳过了库的符号解析,导致符号未被关联。 - 编译参数错误:你添加了
-shared参数实际生成的是动态共享库,并非后续要链接的可重定位目标文件(.o),且动态共享库默认允许编译阶段存在未定义符号,仅在运行加载时才会解析符号,因此nm查看显示U(未定义)属于该场景下的正常表现。 - 目标文件命名混淆:你把生成的共享库命名为
.o后缀,和可重定位目标文件格式混淆,进一步干扰了问题排查。
核心问题2:python3-config 报错的原因
Ubuntu 18.04 默认自带的Python版本为3.6,你直接调用的python3-config实际对应Python 3.6版本,该版本不支持--embed参数,执行参数查询时会直接输出帮助文本,GCC将该帮助文本识别为非法编译参数,因此报出未识别选项错误。
正确操作步骤
前置准备
先安装Python 3.8对应的开发包,确保存在对应版本的config工具:
sudo apt install python3.8-dev
所有编译操作无需使用sudo权限,仅当你需要将生成文件写入系统目录时才需要管理员权限。
场景1:生成可重定位目标文件(后续和业务代码二次链接)
该场景下不需要现在链接libpython,仅编译生成.o文件即可,未定义符号会在最终和业务代码一起链接时解析:
gcc -c -fPIC $(python3.8-config --cflags) -Wall -o Python_Math.o Python_Math.c
后续链接业务代码时,再添加Python 3.8的链接参数即可,示例:
gcc -o your_business_app your_business_code.c Python_Math.o $(python3.8-config --libs --embed)
场景2:生成可独立使用的动态共享库
该场景下需要正确配置链接顺序,将链接参数放在源文件后方:
gcc -shared -fPIC $(python3.8-config --cflags) -Wall -o libPython_Math.so Python_Math.c $(python3.8-config --libs --embed)
编译完成后可通过ldd libPython_Math.so查看是否正确关联了libpython3.8.so,确认链接正常即可使用。
内容的提问来源于stack exchange,提问作者RTC222
相关产品推荐
相关产品推荐

