Я хочу скомпилировать файл 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
Базель выполняет вашу сборку в песочнице, чтобы предотвратить доступ к случайным ресурсам в вашей системе, которые не будут присутствовать, скажем, в системе вашего коллеги.
Это означает, что, если вы не объявили файл (например, библиотеку 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 (и включит ее в песочницу).
(Пробовал комментировать пост ОП, но мне не хватает необходимой кармы.)
FWIW, у меня были проблемы с подключением к библиотекам Python 2.7 (в Windows), даже когда я не использовал Bazel, но запускал компоновщик вручную, поэтому эта проблема может быть не связана с Bazel.