【问题标题】:Unknown CMake command "pybind11_add_module"未知的 CMake 命令“pybind11_add_module”
【发布时间】:2022-12-06 00:05:03
【问题描述】:

我正在开发一个使用 brew 安装依赖项的项目。

我们需要 pybind11 来构建我们的 python 模块。

当我 ll 可用文件时,我得到:

@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

这够了吗?

当我尝试将 pybind11 添加到我的 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".

我错过了什么? 我尝试使用 pip 安装 pybind11,但 cmake 仍然找不到该命令。

(我使用的是基于 ubuntu 22 的 docker 镜像)

我有一个非常简单的代码来测试这个:

#include <pybind11/pybind11.h>

namespace py = pybind11;

int return42(){ return 42;}

PYBIND11_MODULE(pystuff, m) {
    m.def("return42", &return42, "A function that returns 42");
}

如果我不在 cmake 上添加 pybind11_add_module(pystuff binding.cpp) 行,项目会编译,但我猜是 pybind11需要添加模块以实际工作

【问题讨论】:

  • 我会尝试使用 CMake 的 FetchContent,比如 here。但这是一个古老的答案。我更愿意将最后一段从 FetchContent_GetProperties 更改为 FetchContent_MakeAvailable。这些行将在构建项目之前下载 pybind11 依赖项。但是请注意,您仍然需要target_include_directories(&lt;your_exe_or_lib&gt; $pybind11_INCLUDE_DIRS)target_link_libraries(&lt;your_exe_or_lib&gt; $pybind11 之类的东西。
  • 这是我的问题,它是一个与我的环境相关的 XY 问题

标签: c++ cmake pybind11


【解决方案1】:

您需要使用:

find_package(pybind11 REQUIRED)

如果它没有立即找到它,那么 pip install pybind11[global] 使 CMake 绑定从 venv 根可用。然后在CMAKE_PREFIX_PATH中包含/cache/venv

如果确定包含文件pybind11*.cmake 的目录,则可以将pybind11_DIR 设置为包含这些文件的目录,而无需安装pybind11[global]

在任何情况下,您都不应该set()我在 CMakeLists.txt 文件中提到的变量。更喜欢在 Docker 中使用环境变量或 PATHSfind_package 的参数。

【讨论】:

    【解决方案2】:

    我会使用 add_subdirectory 添加 CMake 子项目。我建议您阅读 pybind11 文档,因为我认为这是包含 pybind11 的官方方式。

    【讨论】:

    • 在我的问题中写着我试过那个命令
    猜你喜欢
    • 2021-01-24
    • 2021-06-05
    • 2019-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多