CMake报错Unknown CMake command 'pybind11_add_module'求助
问题:CMake无法识别
pybind11_add_module命令 环境与现状
- 基于Ubuntu22的Docker镜像,使用brew安装项目依赖,需借助pybind11构建Python模块
- 已尝试用pip安装pybind11,但CMake仍报错
pybind11目录文件列表
@DOCKER:include ^_^$ ll pybind11/ total 548K -rw-rw-r-- 1 builder docker 24K Nov 8 10:32 attr.h -rw-rw-r-- 1 builder docker 7.0K Nov 8 10:32 buffer_info.h -rw-rw-r-- 1 builder docker 64K Nov 8 10:32 cast.h -rw-rw-r-- 1 builder docker 8.7K Nov 8 10:32 chrono.h -rw-rw-r-- 1 builder docker 120 Nov 8 10:32 common.h -rw-rw-r-- 1 builder docker 2.1K Nov 8 10:32 complex.h drwxrwxr-x 2 builder docker 4.0K Nov 8 10:32 detail -rw-rw-r-- 1 builder docker 31K Nov 8 10:32 eigen.h -rw-rw-r-- 1 builder docker 12K Nov 8 10:32 embed.h -rw-rw-r-- 1 builder docker 5.5K Nov 8 10:32 eval.h -rw-rw-r-- 1 builder docker 4.7K Nov 8 10:32 functional.h -rw-rw-r-- 1 builder docker 6.7K Nov 8 10:32 gil.h -rw-rw-r-- 1 builder docker 8.7K Nov 8 10:32 iostream.h -rw-rw-r-- 1 builder docker 77K Nov 8 10:32 numpy.h -rw-rw-r-- 1 builder docker 9.6K Nov 8 10:32 operators.h -rw-rw-r-- 1 builder docker 2.2K Nov 8 10:32 options.h -rw-rw-r-- 1 builder docker 123K Nov 8 10:32 pybind11.h -rw-rw-r-- 1 builder docker 80K Nov 8 10:32 pytypes.h drwxrwxr-x 2 builder docker 4.0K Nov 8 10:32 stl -rw-rw-r-- 1 builder docker 27K Nov 8 10:32 stl_bind.h -rw-rw-r-- 1 builder docker 15K Nov 8 10:32 stl.h
CMake配置与报错
当前CMakeLists.txt配置:
include_directories("/cache/venv/include/pybind11") #I tried this too: add_subdirectory("/cache/venv/include/pybind11" ".") pybind11_add_module(pystuff binding.cpp)
报错信息:
CMake Error at src/applications/pycore/CMakeLists.txt:60 (pybind11_add_module): Unknown CMake command "pybind11_add_module".
测试代码
#include <pybind11/pybind11.h> namespace py = pybind11; int return42(){ return 42;} PYBIND11_MODULE(pystuff, m) { m.def("return42", &return42, "A function that returns 42"); }
疑问
这些pybind11文件足够吗?为什么CMake找不到pybind11_add_module命令,我遗漏了什么?
解决办法
核心原因
你当前的pybind11只有头文件,缺少CMake配置文件(比如pybind11Config.cmake、pybind11Targets.cmake),而pybind11_add_module是由这些配置文件定义的CMake命令,仅靠include_directories只能让编译器找到头文件,无法让CMake识别该命令。
具体解决方案
方案1:用apt安装pybind11开发包(Ubuntu22推荐)
直接通过系统包管理器安装完整的pybind11,包含CMake配置文件:
apt-get update && apt-get install -y pybind11-dev
然后修改CMakeLists.txt:
find_package(pybind11 REQUIRED) pybind11_add_module(pystuff binding.cpp)
方案2:适配pip安装的pybind11
pip安装的pybind11的CMake配置文件通常在Python虚拟环境的lib/pythonX.X/site-packages/pybind11/share/cmake/pybind11/路径下(X.X替换为你的Python版本,比如3.10),手动指定路径后再查找:
# 替换为你的虚拟环境中pybind11的CMake配置路径 set(pybind11_DIR "/cache/venv/lib/python3.10/site-packages/pybind11/share/cmake/pybind11") find_package(pybind11 REQUIRED) pybind11_add_module(pystuff binding.cpp)
方案3:使用pybind11源码
下载pybind11完整源码(包含根目录下的CMakeLists.txt),放到项目的第三方依赖目录中,比如third_party/pybind11,然后修改CMakeLists.txt:
add_subdirectory(third_party/pybind11) pybind11_add_module(pystuff binding.cpp)
注意:之前你尝试的add_subdirectory指向的是include/pybind11,这是错误的,必须指向包含CMakeLists.txt的pybind11源码根目录。
内容的提问来源于stack exchange,提问作者Ivan
相关产品推荐
相关产品推荐

