Cmake:使用 conan pybind11 包

2024-02-17

我无法理解如何使用 pybind11 conan 包。我可以使用其他一些,但 pybind11 给我带来了困难。

我的出发点是这样的:

柯南文件.txt:

[requires]
pybind11/2.7.1

[generators]
cmake

主要.cpp:

#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.

???????????? 添加 include([...]/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 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

如果我需要pybind/2.4.3代替pybind/2.7.1 in conanfile.txt I get

fatal error: Python.h: No such file or directory
  112 | #include <Python.h>
      |          ^~~~~~~~~

就像这个问题一样https://github.com/pybind/pybind11/issues/1781 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 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/cmake_example
???? 打造https://github.com/pybind/python_example https://github.com/pybind/python_example
???? 构建 conancentral pybind11 配方!当我将测试包提取到单独的文件夹时,同样会失败。啥啊?? ????


我过去(两三年前)使用过 pybind,它在 conan 上运行没有问题。但是,我现在尝试安装它并遇到类似的问题。这可能与柯南向柯南2.0(一个阿尔法版本 https://github.com/conan-io/conan/releases/tag/2.0.0-alpha1今天发布)并且配方没有根据帐户更改进行更新。

您可能会考虑的另一种选择是使用 conan 安装 pybind不同的发电机。更具体地说,CMakeDeps https://docs.conan.io/en/latest/reference/conanfile/tools/cmake/cmakedeps.html发电机。使用 CMakeDeps 生成器 conan 将创建一个pybind11-config.cmake为您归档,您只需要使用find_package(pybind11 REQUIRED) in CMakeLists.txt。也就是说,您的内容中没有“柯南特定的东西”CMakeLists.txt file.

柯南文件.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 更深入的集成

您还可以使用CMake工具链 https://docs.conan.io/en/1.32/creating_packages/toolchains/cmake.html除了 CMakeDeps 生成器之外,还有 CMakeDeps 生成器。它生成一个conan_toolchain.cmake传递给 cmake 命令的文件--toolchain conan_toolchain.cmake。如果使用它,则无需添加list(APPEND CMAKE_PREFIX_PATH "${CMAKE_BINARY_DIR}")行到您的 CMakeLists.txt 文件。此外,您在 conan 中指定的设置(例如构建类型和编译器)将影响 cmake。也就是说,你不需要在 conan 和 cmake 中都指定这些东西。这似乎是 conan 在即将发布的 2.0 版本中关于 cmake 集成的方向。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Cmake:使用 conan pybind11 包 的相关文章

随机推荐

  • WPF 应用程序的异常报告

    在未处理的异常期间 是否有某种方法可以捕获输出并在应用程序崩溃时显示错误报告对话框 我的想法是在后台运行一个小程序 它唯一的工作就是监听主应用程序的异常退出 然后显示 报告 对话框 用户可以选择通过电子邮件向我发送错误的输出 不太确定如何实
  • 确保给定的 docker 容器正在运行

    我现在在很多服务器上使用 docker 但有时我使用的一些容器由于负载过重而崩溃 我正在考虑添加一个 cron 来检查容器的每一分钟是否正在运行 但我没有找到任何令人满意的方法 我使用 cidfile 启动容器 该文件保存正在运行的容器的
  • 如何恢复netbeans中修改过的文件?

    我正在从事一个重要的项目 我修改了一些 php 和 css 文件并上传主题 然后 我删除了缓存 该项目不起作用 我想在第一次修改时恢复文件 有办法吗 请原谅我的英语 您没有说明您正在使用哪个版本的 Netbeans 但如果它是最新版本 您可
  • Visual Studio 2010 - 卸载 NuGet

    如何从 Visual Studio 2010 中卸载 NuGet 我尝试使用 以管理员身份运行 打开 Visual Studio 2010 但 卸载 选项不可用于从 VS2010 卸载 NuGet 扩展 通常要在VS2010中卸载NuGet
  • 解析模块说明符“vue”时出错。相对模块说明符必须以“./”、“../”或“/”开头

    我正在尝试使用代码让基本的 VueJS 应用程序运行 div div
  • 如何添加 Visual Studio 2013 Scaffolding 中使用的新 Scaffold?

    有没有办法添加新的脚手架或覆盖新的 Visual Studio 2013 脚手架中使用的脚手架功能 我在互联网上能找到的唯一文档是如何使用 CodeTemplates 文件夹覆盖 T4 模板 我想在添加 gt 新脚手架项 时向列表添加一个新
  • 如何区分方向键运动和操纵杆运动?

    我需要有两种不同的行为 一种用于方向键 另一种用于模拟操纵杆 在同一个游戏板上 问题是在onGenericMotionEvent回调 两者都有相同的信息MotionEvent我无法区分它们 d pad MotionEvent action
  • 如何以编程方式 (C#) 从 POP3 邮件中获取附件?

    是否有任何 C API 可以完成此任务 有什么建议么 我用过 n 软件 http www nsoftware com ipworks 过去取得了成功 不是免费的 但是嘿 如果它不起作用 你就可以责怪别人 换句话说 你得到公司的技术支持 他们
  • 配置Google App Engine应用程序以进行跨域

    您能否建议我们如何配置托管在 Google App Engine 上的 Python 应用程序以接受从浏览器完成的 AJAX 选项 GET POST PUT 和 DELETE 此类调用的具体细节是 XmlHTTPRequest 首先向服务器
  • 如何在 subscribe Angular 4 中返回值

    我是角度观察的新手 我有一个问题 我想在订阅方法中返回一个值 我有 以下方法 getFirebaseData idForm string observable
  • 如何将图像保存到SD卡上按钮单击android [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我在 1 XML 中使用 Image
  • Laravel 属于ToMany 具有多列的数据透视表

    目前 我在数据库中有两个表和一个数据透视表 当我需要进行 belongsToMany 查找时 可以将它们连接起来 基本示例是一个数据库表是 teams 另一个数据库表是 members 我可以在团队和成员模型上使用belongsToMany
  • 扩展 WPF 按钮以将数据存储在新属性中

    我想扩展一个 WPF 按钮来存储一些额外的数据 类似于当前的 Tag 属性 附加属性是前进的方向吗 我想要存储的数据将是一个 URL 链接字符串 例如我希望能够执行以下操作
  • Azure 数据工厂复杂 JSON 源(嵌套数组)到 Azure Sql 数据库?

    我有一个 JSON 源文档 将定期上传到 Azure blob 存储 客户希望使用 Azure 数据工厂将此输入写入 Azure Sql 数据库 然而 JSON 很复杂 有许多嵌套数组 到目前为止我还没有找到一种方法来扁平化文档 也许这不受
  • 无 Cookie 属性 web.config

    目前我在 web config 中使用它
  • 如何在 ASP.NET Core 中下载文件?

    在 MVC 中 我们使用以下代码来下载文件 在ASP NET core中 如何实现这一点 HttpResponse response HttpContext Current Response System Net WebClient net
  • 如何将dialogflow与网站集成?

    我使用 Dialogflow chat bot 创建了意图 实体等 现在 我正在尝试将dialogflow与我的网站 html 集成 我按照dialogflow官方网站上记录的说明进行操作 但我仍然很困惑 之后启用网络演示选项 如何编辑附加
  • 具有默认参数的函数的 Elixir 类型规范

    如何为接受一个具有默认值的参数的函数编写类型规范 像下面这样 def foo bar 10 do bar end 会是这样吗 spec foo integer integer 或者会是什么 谢谢 Yes 我想补充一点 如果您的问题是具有默认
  • 这段代码给了我一个错误: Error in if (is.na(s)) { : the condition has length > 1

    请帮助解决我执行以下命令时遇到的错误 stargazer as data frame st sect hh earnings st sect hh earnings sector f Rural c 1 3 4 type html titl
  • Cmake:使用 conan pybind11 包

    我无法理解如何使用 pybind11 conan 包 我可以使用其他一些 但 pybind11 给我带来了困难 我的出发点是这样的 柯南文件 txt requires pybind11 2 7 1 generators cmake 主要 c