使用CMake构建pybind11示例出现Python相关未定义引用如何解决
错误根因
该「undefined reference to `PyUnicode_AsUTF8AndSize'」报错属于链接阶段缺失Python库依赖,你仅配置了Python头文件搜索路径,没有将Python的二进制库链接到最终生成的pybind11模块目标中,同时CMake配置存在多处不规范用法导致依赖传递失效。
修复步骤
1. 清理冗余的Python查找配置
你混用了新版FindPython和已废弃的FindPythonLibs模块,二者输出变量不统一会导致依赖混乱,直接删除find_package(PythonLibs REQUIRED),全程使用新版Python的导入目标即可。
2. 修正依赖库的Python链接配置
不需要手动添加Python头文件路径,直接链接Python::Python导入目标,会自动传递头文件、库依赖等配置:
# 修改sps库的链接配置 target_link_libraries(sps INTERFACE Boost::serialization Python::Python ) # 删掉下面这行手动配置头文件的冗余代码 # target_include_directories(sps INTERFACE ${PYTHON_INCLUDE_DIRS})
3. 修正pybind11模块的链接方式
sps_c是可执行的模块目标,依赖sps需要用PRIVATE而非INTERFACE,同时pybind11_add_module已经自动处理了C++语言标识,不需要额外设置LINKER_LANGUAGE:
pybind11_add_module( sps_c src/probtree.h src/node.h # 注意:如果src/main.cpp里包含main函数,不要放到pybind11模块的源文件列表里 src/main.cpp ) # 删掉冗余的set_target_properties配置 # set_target_properties(sps_c PROPERTIES LINKER_LANGUAGE CXX) target_link_libraries(sps_c PRIVATE sps)
4. 重新编译
清空之前的build缓存目录,重新执行cmake生成和编译命令即可解决未定义引用报错。
内容的提问来源于stack exchange,提问作者John Glen
相关产品推荐
相关产品推荐

