pybind11链接含外部函数调用的动态库出现Undefined Symbol错误如何解决
问题原因
普通C++可执行程序默认会将自身包含的全局、类成员符号导出到进程全局符号表,因此libstu_lib.so运行时可以找到可执行程序中编译的Student::setId实现,运行正常。而pybind11生成的Python扩展模块默认仅导出模块初始化必需的少量符号,其余符号默认隐藏,不会暴露到全局符号表,导致依赖外部符号的libstu_lib.so加载时找不到对应实现,抛出未定义符号错误。
解决方法
无需修改现有动态库源码,仅需在CMake配置中为pybind11扩展模块添加导出符号的配置即可,修改CMakeLists.txt中pybind相关部分如下:
find_package(pybind11 REQUIRED) pybind11_add_module(stu Student_wrapper.cpp Student.cpp) # 新增以下配置,让扩展模块导出自身所有符号 set_target_properties(stu PROPERTIES ENABLE_EXPORTS ON) target_link_libraries(stu PUBLIC stu_lib)
如果Linux环境下上述配置仍未解决问题,可以额外补充链接参数:
set_target_properties(stu PROPERTIES LINK_FLAGS "-Wl,--export-dynamic")
重新编译后导入Python模块即可正常运行。
内容的提问来源于stack exchange,提问作者tihiya
相关产品推荐
相关产品推荐

