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

使用Python ctypes调用C++函数遇未定义符号错误求助

解决Python调用C++共享库时的undefined symbol错误

首先,你遇到的OSError: ./libtest.so: undefined symbol: _ZTVN10__cxxabiv120__si_class_type_infoE错误,本质是编译共享库时没有正确链接C++标准库导致的。这个缺失的符号属于C++ ABI支持组件(来自libstdc++),而你用gcc完成最终的链接步骤时,它不会自动链接C标准库——这是gcc和g的关键区别之一。

正确的编译方案

有两种方法可以修复这个问题:

方法1:全程使用g++编译链接

g会自动处理C标准库的链接,把你的编译命令改成:

g++ -std=c++11 -c -Wall -Werror -fPIC test.cpp
g++ -shared -o libtest.so test.o

方法2:用gcc手动指定链接libstdc++

如果坚持使用gcc,在生成共享库的步骤添加-lstdc++选项:

gcc -std=c++11 -c -Wall -Werror -fPIC test.cpp
gcc -shared -o libtest.so test.o -lstdc++

关于“自动加载所有依赖”的问题

在Linux系统中,共享库的依赖关系是在编译时就被写入库文件的动态节(.dynamic)中的。只要你正确链接了所有依赖库,系统的动态加载器(ld.so)在加载你的libtest.so时,会自动递归加载所有需要的依赖库(比如libstdc++),完全不需要你在Python代码里手动提前加载clib或stdlib。

你之前手动加载这些库没用,就是因为你的libtest.so本身没有把libstdc++标记为依赖——修复编译链接步骤后,这个问题会自动解决。

验证依赖是否正确添加

编译完成后,可以用ldd命令检查共享库的依赖:

ldd libtest.so

如果看到类似libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6的条目,说明依赖已经正确添加了。

内容的提问来源于stack exchange,提问作者Eugene

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:33:07