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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 17:45:03