使用cppyy从Python调用C++函数时遇符号未解析错误求助
解决cppyy调用C++共享库时的符号未解析问题
问题根源
报错是因为C++类的成员函数符号未被正确导出到共享库中,导致cppyy无法找到函数实现。Windows和Linux平台的共享库符号导出规则不同,需要针对性处理。
解决方案步骤
1. 修改头文件,添加跨平台导出宏
更新test.hpp,使用条件编译定义导出宏,同时兼容Windows和Linux平台:
#ifdef _WIN32 #define TEST_EXPORT __declspec(dllexport) #else #define TEST_EXPORT #endif class TEST_EXPORT Test { public: void test(); };
- Windows下(MinGW/g++环境)需要
__declspec(dllexport)显式导出类的符号 - Linux下共享库默认导出符号,无需额外声明
2. 正确编译Windows下的共享库
之前的编译命令包含了头文件,且缺少跨平台编译必备的-fPIC参数,改用以下命令生成dll:
g++ -shared -fPIC test.cpp -o testlib.dll
也可以分两步完成编译与链接:
g++ -c -fPIC test.cpp -o test.o g++ -shared test.o -o testlib.dll
3. 适配Jetson Nano Ubuntu环境的编译
最终部署到Ubuntu 20.04时,需要编译生成Linux平台的.so共享库:
g++ -shared -fPIC test.cpp -o libtestlib.so
对应的Python调用代码要修改加载的库名称:
import cppyy cppyy.include('test.hpp') cppyy.load_library('libtestlib.so') from cppyy.gbl import Test t = Test() t.test()
4. 验证符号导出(可选)
Windows下可以用dumpbin工具检查dll是否包含Test::test的符号:
dumpbin /exports testlib.dll
Linux下用nm工具验证:
nm -D libtestlib.so | grep "test"
如果能看到对应符号,说明导出成功。
内容的提问来源于stack exchange,提问作者Natanel Birarov
相关产品推荐
相关产品推荐

