【问题标题】:Compile C++ file with Python.h import using Bazel使用 Bazel 使用 Python.h 导入编译 C++ 文件
【发布时间】:2017-03-07 15:41:26
【问题描述】:

我想编译一个使用 Python 嵌入的 C++ 文件。因此我#include 在我的 C++ 源代码中。当使用 g++ 作为编译器时,我会指定以下标志:

g++ -o pybridge pybridge.cc -I/usr/include/python2.7/ -lpython2.7

我现在想使用 Bazel 进行编译,并尝试了以下目标规则:

cc_binary(
  name = "pybridge",
  srcs = ["pybridge.cc"],
  copts = ["-I/usr/include/python2.7/"],
  linkopts = ["-lpython2.7"]
)

运行 bazel build 会给出如下错误消息:

pybridge.cc:(.text+0x10): undefined reference to Py_Initialize

【问题讨论】:

  • 你能把bazel -s的输出发过来看看命令吗?另外,如果您在没有沙盒的情况下构建 (--spawn_strategy=standalone) 会发生什么?你知道文件系统上的libpython2.7.so在哪里吗?

标签: python c++ g++ bazel


【解决方案1】:

Bazel 在沙盒中执行您的构建,以防止它访问您系统上的随机资源,这些资源不会出现在您同事的系统上。

这意味着,除非您将文件(如 Python 库)声明为依赖项,否则 Bazel 不会将其放入沙箱中,并且您的构建将无法找到它。

有两种选择:

最简单的方法是使用--spawn_strategy=standalone (bazel build --spawn_strategy=standalone :pybridge) 构建。这告诉 Bazel 在此构建中不要使用沙盒。请注意,据 Bazel 所知,沙盒运行和非沙盒运行之间没有任何变化,因此您必须在不使用沙盒的情况下重新运行之前进行清理,否则只会收到缓存错误。

更难的选择是将/usr/lib/libpython2.7.so 声明为构建的输入。如果您想这样做,请将以下内容添加到 WORKSPACE 文件中:

local_repository(
    name = "system_python",
    path = "/usr/lib/python2.7/config-x86_64-linux-gnu", # Figure out where it is on your system, this is where it is on mine
    build_file_content = """
cc_library(
   name = "my-python-lib",
   srcs = ["libpython2.7.so"],
   visibility = ["//visibility:public"],
)
""",
)

然后在您的 BUILD 文件中添加 deps = ["@system_python//:my-python-lib"],而不是 linkopts = ["-lpython2.7"]。然后 Bazel 将了解您的构建依赖于 libpython2.7.so(并将其包含在沙箱中)。

【讨论】:

    【解决方案2】:

    尝试评论 OP 的帖子,但我缺乏所需的业力。

    FWIW,我在链接 Python 2.7 的库(在 Windows 上)时遇到问题,即使我没有使用 Bazel 而是手动运行链接器,所以这个问题可能与 Bazel 无关。

    【讨论】:

      猜你喜欢
      • 2021-12-19
      • 1970-01-01
      • 1970-01-01
      • 2020-05-17
      • 1970-01-01
      • 2020-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多