Cmake:使用 conan pybind11 包
Cmake: using conan pybind11 package
我无法理解如何使用 pybind11 conan 包。我可以使用其他一些,但是 pybind11 让我很难受。
我的出发点如下:
conanfile.txt:
[requires]
pybind11/2.7.1
[generators]
cmake
main.py:
#include <pybind11/pybind11.h>
int add(int i, int j) {return i + j;}
PYBIND11_MODULE(cobind, m) {m.def("add", &add);}
CMakeLists.txt
cmake_minimum_required(VERSION 3.21)
project(cobind11 VERSION 1.0 LANGUAGES CXX)
include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
conan_basic_setup()
pybind11_add_module(cobind main.cpp)
我努力完成这项工作的痛苦记录:
起点
如果我尝试按上述方式构建项目,我会收到以下错误:
CMake Error at CMakeLists.txt:10 (pybind11_add_module):
Unknown CMake command "pybind11_add_module".
-- Configuring incomplete, errors occurred!
添加 find_package(需要 pybind11)
如果我添加一行 find_package(pybind11 REQUIRED)
我会收到以下错误:
CMake Error at CMakeLists.txt:16 (find_package):
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.
添加包含([...]/pybind11Tools.cmake)
如果我添加一行 #include(${CONAN_PYBIND11_ROOT}/lib/cmake/pybind11/pybind11Tools.cmake)
我会收到以下错误:
CMake Error at /home/[...]/pybind11Tools.cmake:100 (set_property):
set_property could not find TARGET pybind11::pybind11. Perhaps it has not yet been created.
喜欢本期 https://github.com/pybind/pybind11/issues/3388。也许它在新版本中已修复?
升级到 2.8.1
新鲜的pybind11是2.8.1,升级吧
pybind11/2.8.1: Not found in local cache, looking in remotes...
pybind11/2.8.1: Trying with 'conancenter'...
ERROR: Unable to find 'pybind11/2.8.1' in remotes
好的。可以从字里行间看出它曾经有效,所以也许让我们降级?
降级到 2.4.3
如果我在 conanfile.txt
中需要 pybind/2.4.3
而不是 pybind/2.7.1
我得到
fatal error: Python.h: No such file or directory
112 | #include <Python.h>
| ^~~~~~~~~
喜欢本期 https://github.com/pybind/pybind11/issues/1781。与那个问题不同,安装 python*-dev 没有帮助。但无论如何,我不想使用旧的 pybind。
正在尝试来自测试包的 conanfile
conancentral 配方包含一个测试包 (https://github.com/conan-io/conan-center-index/tree/master/recipes/pybind11/all/test_package),它会在创建包时自动进行测试。让我们试试吧!
CMake Error at CMakeLists.txt:13 (find_package):
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.
难道我真的没救了???
也许吧,但是!我可以:
构建 https://github.com/pybind/cmake_example
构建 https://github.com/pybind/python_example
构建 conancentral pybind11 配方!当我将测试包提取到单独的文件夹时,同样失败。什么??
我过去(两三年前)使用过 pybind,它在 conan 上没有问题。但是,我现在尝试安装它并遇到类似的问题。这可能与柯南向柯南 2.0 的演变有关(今天发布了一个 alpha version)并且食谱没有根据帐户更改进行更新。
您可能会考虑的替代方法是使用 不同的生成器 安装 pybind 和 conan。更具体地说,CMakeDeps 生成器。使用 CMakeDeps 生成器,conan 将为您创建一个 pybind11-config.cmake
文件,您只需要在 CMakeLists.txt
中使用 find_package(pybind11 REQUIRED)
。也就是说,您的 CMakeLists.txt
文件中没有“柯南特有的东西”。
conanfile.txt
[requires]
pybind11/2.7.1
[generators]
CMakeDeps
CMakeLists.txt
cmake_minimum_required(VERSION 3.21)
project(cobind11 VERSION 1.0 LANGUAGES CXX)
# Tell cmake to also search in the buld folder for the "<library>-config.cmake"
# files
list(APPEND CMAKE_PREFIX_PATH "${CMAKE_BINARY_DIR}")
find_package(pybind11 REQUIRED)
pybind11_add_module(cobind main.cpp)
main.cpp
#include <pybind11/pybind11.h>
int add(int i, int j) { return i + j; }
PYBIND11_MODULE(cobind, m) { m.def("add", &add); }
有了这个,我能够构建库并在 Python 中使用它。
Conan 与 CMake 深度集成
除了 CMakeDeps 生成器之外,您还可以使用 CMakeToolchain 生成器。它生成一个 conan_toolchain.cmake
文件,您使用 --toolchain conan_toolchain.cmake
将其传递给 cmake 命令。如果您使用它,则无需将 list(APPEND CMAKE_PREFIX_PATH "${CMAKE_BINARY_DIR}")
行添加到您的 CMakeLists.txt 文件中。此外,您在 conan 中指定的设置(例如构建类型和编译器)将影响 cmake。也就是说,你不需要在 conan 和 cmake 中都指定这些东西。这似乎是 conan 在即将发布的 2.0 版本中关于 cmake 集成的方向。
我无法理解如何使用 pybind11 conan 包。我可以使用其他一些,但是 pybind11 让我很难受。
我的出发点如下:
conanfile.txt:
[requires]
pybind11/2.7.1
[generators]
cmake
main.py:
#include <pybind11/pybind11.h>
int add(int i, int j) {return i + j;}
PYBIND11_MODULE(cobind, m) {m.def("add", &add);}
CMakeLists.txt
cmake_minimum_required(VERSION 3.21)
project(cobind11 VERSION 1.0 LANGUAGES CXX)
include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
conan_basic_setup()
pybind11_add_module(cobind main.cpp)
我努力完成这项工作的痛苦记录:
起点
如果我尝试按上述方式构建项目,我会收到以下错误:
CMake Error at CMakeLists.txt:10 (pybind11_add_module):
Unknown CMake command "pybind11_add_module".
-- Configuring incomplete, errors occurred!
添加 find_package(需要 pybind11)
如果我添加一行 find_package(pybind11 REQUIRED)
我会收到以下错误:
CMake Error at CMakeLists.txt:16 (find_package):
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.
添加包含([...]/pybind11Tools.cmake)
如果我添加一行 #include(${CONAN_PYBIND11_ROOT}/lib/cmake/pybind11/pybind11Tools.cmake)
我会收到以下错误:
CMake Error at /home/[...]/pybind11Tools.cmake:100 (set_property):
set_property could not find TARGET pybind11::pybind11. Perhaps it has not yet been created.
喜欢本期 https://github.com/pybind/pybind11/issues/3388。也许它在新版本中已修复?
升级到 2.8.1
新鲜的pybind11是2.8.1,升级吧
pybind11/2.8.1: Not found in local cache, looking in remotes...
pybind11/2.8.1: Trying with 'conancenter'...
ERROR: Unable to find 'pybind11/2.8.1' in remotes
好的。可以从字里行间看出它曾经有效,所以也许让我们降级?
降级到 2.4.3
如果我在 conanfile.txt
中需要 pybind/2.4.3
而不是 pybind/2.7.1
我得到
fatal error: Python.h: No such file or directory
112 | #include <Python.h>
| ^~~~~~~~~
喜欢本期 https://github.com/pybind/pybind11/issues/1781。与那个问题不同,安装 python*-dev 没有帮助。但无论如何,我不想使用旧的 pybind。
正在尝试来自测试包的 conanfile
conancentral 配方包含一个测试包 (https://github.com/conan-io/conan-center-index/tree/master/recipes/pybind11/all/test_package),它会在创建包时自动进行测试。让我们试试吧!
CMake Error at CMakeLists.txt:13 (find_package):
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.
难道我真的没救了???
也许吧,但是!我可以:
构建 https://github.com/pybind/cmake_example
构建 https://github.com/pybind/python_example
构建 conancentral pybind11 配方!当我将测试包提取到单独的文件夹时,同样失败。什么??
我过去(两三年前)使用过 pybind,它在 conan 上没有问题。但是,我现在尝试安装它并遇到类似的问题。这可能与柯南向柯南 2.0 的演变有关(今天发布了一个 alpha version)并且食谱没有根据帐户更改进行更新。
您可能会考虑的替代方法是使用 不同的生成器 安装 pybind 和 conan。更具体地说,CMakeDeps 生成器。使用 CMakeDeps 生成器,conan 将为您创建一个 pybind11-config.cmake
文件,您只需要在 CMakeLists.txt
中使用 find_package(pybind11 REQUIRED)
。也就是说,您的 CMakeLists.txt
文件中没有“柯南特有的东西”。
conanfile.txt
[requires]
pybind11/2.7.1
[generators]
CMakeDeps
CMakeLists.txt
cmake_minimum_required(VERSION 3.21)
project(cobind11 VERSION 1.0 LANGUAGES CXX)
# Tell cmake to also search in the buld folder for the "<library>-config.cmake"
# files
list(APPEND CMAKE_PREFIX_PATH "${CMAKE_BINARY_DIR}")
find_package(pybind11 REQUIRED)
pybind11_add_module(cobind main.cpp)
main.cpp
#include <pybind11/pybind11.h>
int add(int i, int j) { return i + j; }
PYBIND11_MODULE(cobind, m) { m.def("add", &add); }
有了这个,我能够构建库并在 Python 中使用它。
Conan 与 CMake 深度集成
除了 CMakeDeps 生成器之外,您还可以使用 CMakeToolchain 生成器。它生成一个 conan_toolchain.cmake
文件,您使用 --toolchain conan_toolchain.cmake
将其传递给 cmake 命令。如果您使用它,则无需将 list(APPEND CMAKE_PREFIX_PATH "${CMAKE_BINARY_DIR}")
行添加到您的 CMakeLists.txt 文件中。此外,您在 conan 中指定的设置(例如构建类型和编译器)将影响 cmake。也就是说,你不需要在 conan 和 cmake 中都指定这些东西。这似乎是 conan 在即将发布的 2.0 版本中关于 cmake 集成的方向。