Скомпилируйте файл C ++ с помощью импорта Python.h, используя Bazel

Я хочу скомпилировать файл C ++, который использует встраивание Python. Поэтому я #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

0

Решение

Базель выполняет вашу сборку в песочнице, чтобы предотвратить доступ к случайным ресурсам в вашей системе, которые не будут присутствовать, скажем, в системе вашего коллеги.

Это означает, что, если вы не объявили файл (например, библиотеку 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, а не linkopts = ["-lpython2.7"], добавлять deps = ["@system_python//:my-python-lib"], Тогда Базель поймет, что ваша сборка зависит от libpython2.7.so (и включит ее в песочницу).

1

Другие решения

(Пробовал комментировать пост ОП, но мне не хватает необходимой кармы.)

FWIW, у меня были проблемы с подключением к библиотекам Python 2.7 (в Windows), даже когда я не использовал Bazel, но запускал компоновщик вручную, поэтому эта проблема может быть не связана с Bazel.

0