如何让CMake找到pybind11

13

我正尝试按照这个网页上的简单示例,使用pybind11将python嵌入c++中。然而,在尝试使用cmake构建解决方案时,我一直收到一个错误信息,内容如下:

By not providing "Findpybind11.cmake" in CMAKE_MODULE_PATH this project has asked CMake to find a package configuration file provided by "pybind11", but CMake did not find one.

Could not find a package configuration file provided by "pybind11" with any of the following names:

pybind11Config.cmake
pybind11-config.cmake

我在桌面上有一个名为pybindtest的文件夹,其中包含如上述链接所描述的CMakeLists.txt和main.cpp文件,以及我创建的一个build文件夹。在进入build文件夹后,我尝试了以下几行代码但都无效(在Powershell 7中运行):

cmake ..
cmake .. -Dpybind11_DIR=C:/Users/ben.wolfley/Anaconda3/Library/share/cmake/pybind11/pybind11Config.cmake
cmake .. -DCMAKE_MODULE_PATH=C:/Users/ben.wolfley/Anaconda3/Library/share/cmake/pybind11

我使用conda install pybind11 安装了 pybind11,而 C:\Users\ben.wolfley\Anaconda3\Library\share\cmake\pybind11 中有 pybind11Config.cmake。


如果您尝试使用cmakegui,应该会有一个名为pybind11_DIR的变量或类似的内容。您可以尝试将其设置为*.cmake目录,然后再次尝试一下吗? - user3389943
我认为你应该设置CMAKE_PREFIX_PATH而不是CMAKE_MODULE_PATH。 - user3389943
"...并且pybind11Config.cmake位于C:\Users\ben.wolfley\Anaconda3\Library\share\cmake\pybind11中" - 因此,根据错误消息的建议(而不是您当前设置的文件),将pybind11_DIR变量设置为该目录 - Tsyvarev
4个回答

17

如果有人遇到与Anaconda无关的相同问题,比如直接使用pip pybind11或手动克隆安装,这两种方法在我的情况下都会引起问题。用git手动安装pybind11没有安装cmake配置pybind11Config.cmake,虽然有一个tools/pybind11Config.cmake.in文件,但我无法将其转换为正确的pybind11Config.cmake

使用pip全局安装pybind11对我解决了问题,并自动卸载了手动git安装:

pip install "pybind11[global]"

希望能安装包括pybind11pybind11-global在内,并具有像Anaconda一样的适当的cmake配置。


3
将以下内容添加到CMakeLists.txt文件中:
```cmake
# set pybind11 dir
set(pybind11_DIR /Users/Caleb/Softwares/pybind11)
find_package(pybind11 REQUIRED)
```

谢谢,这真的很有帮助。对于未来需要帮助的人: 在我的Ubuntu 22.04和Python 3.10上,pybind11目录位于:/usr/local/lib/python3.10/dist-packages/ 您可以通过CMD行找到您的PyBind11目录:输入“python -v”进入Python控制台-->将提供所有加载的软件包的详细信息。然后,在Python控制台中,只需使用“import pybind11”,并且在第一行输出中,您应该会看到pybind11的存储位置。希望这有所帮助! - asti205
对于那些使用PyPI安装了pybind11的人,你需要通过set(pybind11_DIR python_env/site-packages/pybind11/share/cmake/pybind11)设置完整目录到'.cmake'文件,或者通过find_package(pybind11 REQUIRED CONFIG)在配置模式下查找包。 - MrCrHaM

2
感谢Tsyvarev指导我正确的方向。以下命令有效:
cmake .. -G "Visual Studio 15 2017" -A x64 `
      -Dpybind11_DIR=C:/Users/ben.wolfley/Anaconda3/Library/share/cmake/pybind11/

我指向的是 .cmake 文件,而不是文件所在的目录。为了让代码工作,我还必须指定编译器。


0
我按照这个教程开始使用pybind11:https://www.blopig.com/blog/2021/03/c-python-bindings-in-5-minutes/ 这非常容易,而且不需要编写CMake脚本。
但是...我想在我选择的IDE(Qt Creator)中编辑我的代码,并希望它为我提供智能感知等功能。因此,我为了这个好处将CMake添加到了项目中(Qt Creator可以依赖它)。
所以,为了让我的IDE简单地不抱怨缺少的包含文件(甚至可以编译代码,尽管实际上不构建整个pybind包装器),我只需要添加几个包含路径。在我的环境中,它们如下:
include_directories(/usr/include/python3.6m)
include_directories(/home/johndoe/.local/lib/python3.6/site-packages/pybind11/include)

当然,那并不具备可移植性。为了解决这个问题,我使用了一个宏,可以让我利用环境变量来实现更好的解决方案。
macro(include_envvar_directory varname)
    if(DEFINED ENV{${varname}})
        set(dir_path $ENV{${varname}})
    else()
        message(FATAL_ERROR "ERROR: Env var ${varname} must be defined!")
    endif()
    if(NOT EXISTS ${dir_path})
        message(FATAL_ERROR
            "ERROR: Invalid path: ${dir_path} specified by env var: ${varname}")
    endif()
    message(STATUS "Adding to include path: ${dir_path}")
    include_directories(${dir_path})
endmacro()

include_envvar_directory(PY_INCLUDE_PATH)
include_envvar_directory(PYBIND_INCLUDE_PATH)

有了这个设置,我通过IDE的功能将PY_INCLUDE_PATHPYBIND_INCLUDE_PATH环境变量传递给CMake,以便为每个项目/工作站定义这样的变量。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接