build - cmake 到 bazel - cppyy - 共享库和包含路径

标签 build shared-libraries bazel cppyy

我想使用 FindCppyy.cmake 中的宏 cppyy_add_bindings| .我必须使用 bazel 项目将其添加到 cpp/python 中。我如何处理库依赖项?我是否必须在 py 文件中显式加载所有库,或者是否可以让 bazel 为我执行此操作?

最佳答案

我不熟悉 Bazel,但也许可以阐明 cppyy 的需求/期望。特别是,FindCppyy.cmake 在编写时考虑了特定类型的使用,可能并不适合所有人。

cppyy 需要的是从 Python 使用的 C++ 代码的链接器符号在运行时可用。如何提供它们并不重要:只要它们可用,它就会起作用。这里有几个选项:

  • 将依赖库与另一个将加载的库链接起来。这在使用字典时很典型(https://cppyy.readthedocs.io/en/latest/utilities.html#dictionaries):只需将所有相关库链接到字典共享库,然后只加载字典,其余部分将由动态链接器引入。这是最常见的方法 AFAIK,准确地说是 b/c 依赖关系很容易弄清楚,因为构建工具已经有了它们并且已经知道如何链接。

  • 将它们添加到 .rootmap 文件 ( https://cppyy.readthedocs.io/en/latest/utilities.html#class-loader ):当找不到类时,.rootmap 文件(在 Linux/Mac 或 Windows 上的 PATH)被搜索,如果在那里找到类,则指定的库都被加载。这符合我的偏好(b/c class-lazy,而不是 project-lazy)并且通常与上面的字典文件一起使用。

  • 在 Python 模块中明确使用 cppyy.load_library。就个人而言,我不喜欢这种方法,除非代码确实很好地划分,和/或项目很小(最多只有少数几个库),因为这种方法并不懒惰。

  • 使用另一种方式,例如ctypes.CDLL。这会起作用,但是 ctypes.CDLL 在不同操作系统之间的行为非常不同,给开发人员带来了更多工作,所以我不推荐它。它也不懒惰。

提到的 cppyy cmake 宏假设目标是每个项目一个 python 模块,并且作为惰性粒度,项目(而不是单个类)足够好。如果这符合您的目的,我会选择上面的第一个选项:从项目(的每个部分)的所有标题生成一个字典,并从 Bazel 获取它的库列表,然后在构建生成的字典代码时, 只需与它链接。最后,依靠自动加载,或者简单地 load_library 一个字典共享库。

现在,如果我完全从字面上理解你的问题(不知道我是否应该这样做),那么 Bazel 可能有一个选项可以将库显式加载到进程中,例如启动?如果是这样,只要库加载了 RTLD_GLOBAL 标志(Linux、Mac;这很常见),或者导出相关符号(Windows;也很常见,但需要更加小心).

关于build - cmake 到 bazel - cppyy - 共享库和包含路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61111456/

相关文章:

bazel - 如何将自定义规则的输出放在 `bazel-genfiles/` 而不是 `bazel-out/` 中?

java - maven安装lib文件夹的快速方法

java - Maven 多模块项目生命周期

c++ - Visual Studio Code - 远程调试 Bazel C++ - 无法读取文件'vscode-remote ://dev- file

c++ - 隐藏 C++ 库的私有(private)成员

cmake - 如何防止 CMake 在安装时为共享库创建符号链接(symbolic link)?

ubuntu - 无法在 Ubuntu 20.04 上安装 bazel - EXPKEYSIG 无效

android - Dagger2- 切换不同风格的依赖关系 : Android Studio

c++ - CMake add_executable() 使用 .cpp 文件还是 .hpp 文件?

go - 交叉编译共享库